gpt4 book ai didi

UrlEncodedFormEntity 的 Android HTTP 上传进度

转载 作者:太空狗 更新时间:2023-10-29 16:22:54 27 4
gpt4 key购买 nike

有几个问题讨论了如何使用 multipart/form-data 数据格式将进度指示添加到 Android 中的 HTTP 文件上传。建议的典型方法集中在 Can't grab progress on http POST file upload (Android) 中的最佳答案中。 -- 包括来自完整 Apache HTTPClient 库的 MultipartEntity 类,然后将它用于获取数据的输入流包装在一个在读取字节时计算字节数的流中。

这种方法适用于这种情况,但不幸的是不适用于通过 UrlEncodedFormEntity 发送数据的请求,它希望将其数据以字符串而不是 InputStreams 的形式传递给它。

所以我的问题是,有哪些方法可以通过这种机制确定上传进度?

最佳答案

您可以覆盖任何 HttpEntity 实现的 #writeTo 方法,并在字节写入输出流时对其进行计数。

DefaultHttpClient httpclient = new DefaultHttpClient();
try {
HttpPost httppost = new HttpPost("http://www.google.com/sorry");

MultipartEntity outentity = new MultipartEntity() {

@Override
public void writeTo(final OutputStream outstream) throws IOException {
super.writeTo(new CoutingOutputStream(outstream));
}

};
outentity.addPart("stuff", new StringBody("Stuff"));
httppost.setEntity(outentity);

HttpResponse rsp = httpclient.execute(httppost);
HttpEntity inentity = rsp.getEntity();
EntityUtils.consume(inentity);
} finally {
httpclient.getConnectionManager().shutdown();
}

static class CoutingOutputStream extends FilterOutputStream {

CoutingOutputStream(final OutputStream out) {
super(out);
}

@Override
public void write(int b) throws IOException {
out.write(b);
System.out.println("Written 1 byte");
}

@Override
public void write(byte[] b) throws IOException {
out.write(b);
System.out.println("Written " + b.length + " bytes");
}

@Override
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
System.out.println("Written " + len + " bytes");
}

}

关于UrlEncodedFormEntity 的 Android HTTP 上传进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854555/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com