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
HttpClient is fully thread-safe when used with a thread-safe connection manager such as MultiThreadedHttpConnectionManager.
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...
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); } }
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; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With