httpClient, problem to do a POST of a Multipart in

2020-06-29 05:22发布

Well I am wondering how I can achieve to post a multipart in chunked mode. I have 3 parts, and the files which can be big so must be sent in chunks.

Here what I do :

    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);

On the server side, I do receive the 3 parts but the files for example are not chunked, they are received as one piece... basically total I see 4 boundaries appearing only : 3 --xxx, 1 at the end --xxx-- . I thought the override of isChunked would do the trick but no... ;(

Is what I am trying to do feasible ? How could I make that work ?

Thanks a lot. Fab

2条回答
你好瞎i
2楼-- · 2020-06-29 06:02

Usually any decent server-side HTTP framework (such as Java EE Servlet API) would hide transport details such as transfer coding from the application code. just because you are not seeing chunk delimiters by reading from the content stream does not mean the chunk coding was not used by the underlying HTTP transport.

You can see exactly what kind of HTTP packets HttpClient generates by activating the wire logging as described here:

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

查看更多
Evening l夕情丶
3楼-- · 2020-06-29 06:14

To generate a multipart body chunked, one of the part must have it size unavailable. Like a part that is streaming.

For example let assume your file2 is a really big video. You could replace the part of your code:

FileBody fileBody2 = new FileBody(file2);
multipartEntity.addPart("theFile2", fileBody2);

wtih that code:

final InputStreamBody binVideo = new InputStreamBody(new FileInputStream(file2), "video/mp4", file2.getName());
multipartEntity.addPart("video", binVideo);

since now the third part is an InputStream instead of File, your multipart HTTP request will have the header Transfer-Encoding: chunked.

查看更多
登录 后发表回答