好吧,我想知道如何在分块模式中发布多部分。我有3个部分,文件可以很大,所以必须以块的形式发送。
我在这做什么:
MultipartEntity multipartEntity = new MultipartEntity() {
@Override
public boolean isChunked() {
return true;
}
};
multipartEntity.addPart("theText", new StringBody("some text", Charset.forName("UTF-8")));
FileBody fileBody1 = new FileBody(file1);
multipartEntity.addPart("theFile1", fileBody1);
FileBody fileBody2 = new FileBody(file2);
multipartEntity.addPart("theFile2", fileBody2);
httppost.setEntity(multipartEntity);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpClient = new DefaultHttpClient(params);
HttpResponse httpResponse = httpClient.execute(httppost);
在服务器端,我确实收到了3个部分,但是例如文件没有分块,它们作为一个整体收到...基本上我总共只看到4个边界:3 --xxx,最后1个--xxx--。 我认为覆盖isChunked可以做到这一点,但没有...;(
我想做的是可行的吗?我怎么能做到这一点?
非常感谢。 FAB
答案 0 :(得分:2)
要生成分块的多部分主体,其中一个部分必须使其大小不可用。就像流媒体的一部分。
例如,假设您的file2是一个非常大的视频。您可以替换代码的一部分:
FileBody fileBody2 = new FileBody(file2);
multipartEntity.addPart("theFile2", fileBody2);
代码:
final InputStreamBody binVideo = new InputStreamBody(new FileInputStream(file2), "video/mp4", file2.getName());
multipartEntity.addPart("video", binVideo);
由于现在第三部分是InputStream而不是File,因此您的多部分HTTP请求将具有标题 Transfer-Encoding:chunked 。
答案 1 :(得分:0)
通常任何体面的服务器端HTTP框架(例如Java EE Servlet API)都会隐藏传输细节,例如应用程序代码中的传输编码。仅仅因为你没有通过读取内容流看到块分隔符并不意味着底层HTTP传输没有使用块编码。
您可以通过激活此处所述的电子记录来查看完全 HttpClient生成的HTTP数据包类型: