Я пытаюсь получить ход фактической загрузки файлов с помощью HttpPost. У меня есть стабильное решение до сих пор (которое я нашел здесь в SO), которое имеет прогресс, но после загрузки больших файлов я понял, что он учитывает только байты, записанные в выходной буфер, а не прогресс пост-передачи. Я хотел бы как-то получить ход фактической «должности». Может кто-нибудь объяснить, как я могу достичь этого, используя то, что я так усердно трудился, чтобы получить до сих пор? Большинство решений, которые я нашел в Интернете, учитывают только байты, записанные в выходной буфер (что достаточно для небольших файлов, но не при передаче больших файлов).Получить прогресс загрузки файлов с помощью HttpPost в Android
общественности статической строки postFile (окончательный контекст Context, String имя_файла) бросает исключение {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://my.url/");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
final File file = new File(fileName);
final long totalSize = file.length();
FileBody fb = new FileBody(file);
builder.addPart("uploaded_file", new FileBody(new File(fileName)));
final HttpEntity yourEntity = builder.build();
int progressPercent = 0;
class ProgressiveEntity implements HttpEntity {
@Override
public void consumeContent() throws IOException {
yourEntity.consumeContent();
}
@Override
public InputStream getContent() throws IOException,
IllegalStateException {
return yourEntity.getContent();
}
@Override
public Header getContentEncoding() {
return yourEntity.getContentEncoding();
}
@Override
public long getContentLength() {
return yourEntity.getContentLength();
}
@Override
public Header getContentType() {
return yourEntity.getContentType();
}
@Override
public boolean isChunked() {
return yourEntity.isChunked();
}
@Override
public boolean isRepeatable() {
return yourEntity.isRepeatable();
}
@Override
public boolean isStreaming() {
return yourEntity.isStreaming();
} // CONSIDER put a _real_ delegator into here!
@Override
public void writeTo(OutputStream outstream) throws IOException {
class ProxyOutputStream extends FilterOutputStream {
public ProxyOutputStream(OutputStream proxy) {
super(proxy);
}
public void write(int idx) throws IOException {
out.write(idx);
}
public void write(byte[] bts) throws IOException {
out.write(bts);
}
public void write(byte[] bts, int st, int end) throws IOException {
out.write(bts, st, end);
}
public void flush() throws IOException {
out.flush();
}
public void close() throws IOException {
out.close();
}
} // CONSIDER import this class (and risk more Jar File Hell)
class ProgressiveOutputStream extends ProxyOutputStream {
long totalSent;
public ProgressiveOutputStream(OutputStream proxy) {
super(proxy);
totalSent = 0;
}
public void write(byte[] bts, int st, int end) throws IOException {
// end is the amount being sent this time
// st is always zero and end=bts.length()
totalSent += end;
int progress = (int) ((totalSent/(float) totalSize) * 100);
out.write(bts, st, end);
}
}
yourEntity.writeTo(new ProgressiveOutputStream(outstream));
}
};
ProgressiveEntity myEntity = new ProgressiveEntity();
post.setEntity(myEntity);
//Output to buffer is complete at this point!
HttpResponse response = client.execute(post);
String jsonResponseStr = getContent(response);
Log.d("MYTAG",jsonResponseStr);
return jsonResponseStr;
}
В моем приемном сценарии на удаленном сервере, я только эхо-ную строку, так что я могу отправить немедленно (вообще никакой обработки файлов и баз данных), а ответ с сервера все еще занимает очень много времени. Я твердо верю, что в этот момент передача происходит после завершения записи в буфер.
Использовать publishProgress(); Проверьте [this] (http://stackoverflow.com/questions/6924447/how-to-implement-file-upload-progress-bar-in-android) – ashutiwari4
@ ashutiwari4 этот ответ также учитывает прогресс записи в буфер, если вы не используйте параметр setfixedlengthstreamingmode, который я не считаю методом любого использования. Я хотел бы избежать переписывания всего, что у меня есть, если это возможно. –
'НЕ прогресс передачи сообщения .'. Что такое прогресс после передачи? – greenapps