Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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   {     String fileName = "test.avi";     File file = new File(fileName);      String serverResponse = null;     HttpParams params = new BasicHttpParams();     params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, true);     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);     HttpClient client = new DefaultHttpClient(params);     HttpPut put = new HttpPut("http://localhost:8080/" + fileName);      FileEntity fileEntity = new FileEntity(file, "binary/octet-stream");     put.setEntity(fileEntity);         HttpResponse response = client.execute(put);     HttpEntity entity = response.getEntity();     if (entity != null)     {       serverResponse = EntityUtils.toString(entity);       System.out.println(serverResponse);     }   } 

It work's quite well but now I want to have a progress bar which shows the progress of the file upload. How can this be made? I found a code snippet at File Upload with Java (with progress bar) but it is designed for Apache HTTP Client 3 (org.apache.commons.httpclient) and the RequestEntity class does not exist in Apache HTTP Client 4. ;(

Maybe someone of you has an approach?

Many greetings

Benny

like image 803
Benny Neugebauer Avatar asked Aug 14 '11 14:08

Benny Neugebauer


People also ask

Is Apache HttpClient thread safe?

HttpClient is fully thread-safe when used with a thread-safe connection manager such as MultiThreadedHttpConnectionManager.


1 Answers

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;     } } 
like image 187
AlikElzin-kilaka Avatar answered Oct 30 '22 07:10

AlikElzin-kilaka