HttpClient загружает большой файл и показывает количество отправленных байтов

Я нашел этот пример кода

import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;
public class PostFile {
 public static void main(String[] args) throws Exception {
 HttpClient httpclient = new DefaultHttpClient();
 httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
 HttpPost httppost = new HttpPost("http://localhost:9001/upload.php");
 File file = new File("c:/TRASH/zaba_1.jpg");
 MultipartEntity mpEntity = new MultipartEntity();
 ContentBody cbFile = new FileBody(file, "image/jpeg");
 mpEntity.addPart("userfile", cbFile);
 httppost.setEntity(mpEntity);
 System.out.println("executing request " + httppost.getRequestLine());
 HttpResponse response = httpclient.execute(httppost);
 HttpEntity resEntity = response.getEntity();
 System.out.println(response.getStatusLine());
 if (resEntity != null) {
 System.out.println(EntityUtils.toString(resEntity));
 }
 if (resEntity != null) {
 resEntity.consumeContent();
 }
 httpclient.getConnectionManager().shutdown();
 }
}

Мне просто интересно, как получить загруженную байтовую сумму?

1 ответ

Переопределить FileBody.writeTo(OutputStream) для подсчета байтов по мере их записи. Это позволяет подсчитывать количество байтов (даже если прерывается), как во время загрузки, так и после его завершения.

public class FileBodyCounter extends FileBody {
 private volatile long byteCount;
 public long getBytesWritten() {
 return byteCount;
 }
 public void writeTo(OutputStream out) {
 super.writeTo(new FilterOutputStream(out) {
 // Other write() methods omitted for brevity. Implement for better performance
 public void write(int b) throws IOException {
 byteCount++;
 super.write(b);
 }
 });
 }
}

Используйте это вместо стандартного FileBody и извлекайте bytecount во время загрузки или после того, как сообщение завершено.

licensed under cc by-sa 3.0 with attribution.