httpClient,在分块模式下执行多部分POST的问题...
问题描述:
嗯,我想知道如何实现在分块模式下发布多部分。我有3个部分,可能很大的文件必须分块发送。httpClient,在分块模式下执行多部分POST的问题...
这里我做什么:
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边界只出现在: - 3xxxx,最后1 --xxx--。 我认为isChunked的覆盖会做的伎俩,但没有...;?(
是什么,我试图做是可行的我怎么能有这样的工作
非常感谢 的Fab
答
通常,任何体面的服务器端HTTP框架(如Java EE Servlet API)都会隐藏传输细节,例如从应用程序代码中传输编码,因为您没有通过从内容流中读取来看到块分隔符并不意味着块编码未被底层HTTP传输使用。
你可以看到究竟什么样的HTTP数据包HttpClient的生成由此处所述激活线记录:
答
要生成一个多体分块,部分之一,必须有它的尺寸不可用。就像流媒体的一部分。
例如,假设您的file2是一个非常大的视频。你可以取代你的代码的一部分:
FileBody fileBody2 = new FileBody(file2);
multipartEntity.addPart("theFile2", fileBody2);
wtih代码:
final InputStreamBody binVideo = new InputStreamBody(new FileInputStream(file2), "video/mp4", file2.getName());
multipartEntity.addPart("video", binVideo);
因为现在第三部分是一个InputStream,而不是文件,您多HTTP请求将有头转移 - 编码:分块。