httpClient,在Chunked模式下对Multipart进行POST的问题...

时间:2011-08-26 01:16:25

标签: file http httpclient multipart chunked

好吧,我想知道如何在分块模式中发布多部分。我有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

2 个答案:

答案 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数据包类型:

http://hc.apache.org/httpcomponents-client-ga/logging.html