【问题标题】:httpClient, problem to do a POST of a Multipart in Chunked mode...httpClient,在分块模式下进行多部分 POST 的问题...
【发布时间】:2011-08-26 01:16:25
【问题描述】:

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

我正在尝试做的事情可行吗?我怎样才能做到这一点?

非常感谢。 棒棒哒

【问题讨论】:

    标签: file http httpclient multipart chunked


    【解决方案1】:

    要生成分块的多部分正文,其中一个部分的大小必须不可用。就像一个正在流式传输的部分。

    例如,假设您的 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

    【讨论】:

      【解决方案2】:

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

      您可以确切地看到 HttpClient 通过激活此处描述的线路日志记录生成的 HTTP 数据包:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-29
        • 2011-03-04
        • 2018-09-14
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        相关资源
        最近更新 更多