1

好吧,我想知道如何以分块模式发布多部分。我有 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 可以解决问题,但没有...... ;(

我想做的事情可行吗?我怎么能做到这一点?

非常感谢。工厂

4

2 回答 2

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

于 2012-07-18T19:02:48.753 回答
0

通常,任何体面的服务器端 HTTP 框架(例如 Java EE Servlet API)都会隐藏传输细节,例如来自应用程序代码的传输编码。仅仅因为从内容流中读取没有看到块分隔符并不意味着底层 HTTP 传输没有使用块编码。

您可以通过激活线路日志记录来准确查看HttpClient 生成的 HTTP 数据包类型,如下所述:

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

于 2011-08-26T13:57:05.250 回答