How to get a progress bar for a file upload with Apache HttpClient 4?

前端 未结 4 1804
暗喜
暗喜 2020-11-29 22:46

I\'ve got the following code for a file upload with Apache\'s HTTP-Client (org.apache.http.client):

  public static void main(String[] args) throws Exception         


        
4条回答
  •  悲哀的现实
    2020-11-29 23:24

    I introduced a derived FileEntity that just counts the written bytes. It uses OutputStreamProgress that does the actual counting (kind of a decorator to the actual OutputStream).

    The advantage of this (and decoration in general) is that I do not need to copy the actual implementation, like the the actual copying from the file stream to the output stream. I can also change to use a different (newer) implementation, like the NFileEntity.

    Enjoy...

    FileEntity.java

    public class FileEntity extends org.apache.http.entity.FileEntity {
    
        private OutputStreamProgress outstream;
    
        public FileEntity(File file, String contentType) {
            super(file, contentType);
        }
    
        @Override
        public void writeTo(OutputStream outstream) throws IOException {
            this.outstream = new OutputStreamProgress(outstream);
            super.writeTo(this.outstream);
        }
    
        /**
         * Progress: 0-100
         */
        public int getProgress() {
            if (outstream == null) {
                return 0;
            }
            long contentLength = getContentLength();
            if (contentLength <= 0) { // Prevent division by zero and negative values
                return 0;
            }
            long writtenLength = outstream.getWrittenLength();
            return (int) (100*writtenLength/contentLength);
        }
    }
    

    OutputStreamProgress.java

    public class OutputStreamProgress extends OutputStream {
    
        private final OutputStream outstream;
        private volatile long bytesWritten=0;
    
        public OutputStreamProgress(OutputStream outstream) {
            this.outstream = outstream;
        }
    
        @Override
        public void write(int b) throws IOException {
            outstream.write(b);
            bytesWritten++;
        }
    
        @Override
        public void write(byte[] b) throws IOException {
            outstream.write(b);
            bytesWritten += b.length;
        }
    
        @Override
        public void write(byte[] b, int off, int len) throws IOException {
            outstream.write(b, off, len);
            bytesWritten += len;
        }
    
        @Override
        public void flush() throws IOException {
            outstream.flush();
        }
    
        @Override
        public void close() throws IOException {
            outstream.close();
        }
    
        public long getWrittenLength() {
            return bytesWritten;
        }
    }
    

提交回复
热议问题