【发布时间】:2013-09-28 15:31:17
【问题描述】:
短版 - org.apache...MultipartEntity 已弃用,其升级版MultipartEntityBuilder 在我们的在线论坛中的代表性不足。让我们解决这个问题。如何注册回调,以便我的 (Android) 应用在上传文件时显示进度条?
长版 - 这是MultipartEntityBuilder 的“缺失的简单示例”:
public static void postFile(String fileName) throws Exception {
// Based on: https://stackoverflow.com/questions/2017414/post-multipart-request-with-android-sdk
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(SERVER + "uploadFile");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("file", new FileBody(new File(fileName)));
builder.addTextBody("userName", userName);
builder.addTextBody("password", password);
builder.addTextBody("macAddress", macAddress);
post.setEntity(builder.build());
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
// response.getStatusLine(); // CONSIDER Detect server complaints
entity.consumeContent();
client.getConnectionManager().shutdown();
} // FIXME Hook up a progress bar!
我们需要修复 FIXME。 (一个额外的好处是上传可中断。)但是(无论我是否错了,请纠正我),所有在线示例似乎都不足。
这个http://pastebin.com/M0uNZ6SB,例如,将文件上传为“二进制/八位字节流”;不是“多部分/表单数据”。我需要真实的字段。
此示例File Upload with Java (with progress bar) 显示了如何覆盖*Entity 或*Stream。所以也许我可以告诉MultipartEntityBuilder 到.create() 一个覆盖其上传进度的实体?
因此,如果我想覆盖某些内容,并将内置流替换为每 1000 个字节发送一个信号的计数流,也许我可以扩展 FileBody 部分,并覆盖其 getInputStream 和/或writeTo.
但是当我尝试class ProgressiveFileBody extends FileBody {...} 时,我得到了臭名昭著的java.lang.NoClassDefFoundError。
所以当我在我的 .jar 文件中寻找丢失的 Def 时,有人可以检查我的数学,并指出一个我忽略的更简单的修复吗?
【问题讨论】:
-
谢谢例如。正是我需要的!
-
有人能告诉我在哪里可以获得适合 MultipartEntityBuilder 的库吗?
-
根据“org.apache.http.entity.mime”,它可能是 httpmime-4.3.jar。我在另一条评论中列出了我的罐子......
-
Philip 我想我有一个类似的问题,八进制流不是真正的字段.. Api 拒绝它.. 我很好奇你是否可以看看我的最新帖子并给出你的想法跨度>
标签: android http file-upload