httpClient, problem to do a POST of a Multipart in Chunked mode…

僤鯓⒐⒋嵵緔 提交于 2019-12-05 07:28:04

问题


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


回答1:


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.




回答2:


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



来源:https://stackoverflow.com/questions/7199080/httpclient-problem-to-do-a-post-of-a-multipart-in-chunked-mode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!