Can HTTP multipart and chunking coexist?
Asked Answered
Y

1

9

I'm using apache HttpClient to post several files to server. Here's the code:

    public static HttpResponse stringResponsePost(String urlString, String content, byte[] image,
        HttpContext localContext, HttpClient httpclient) throws Exception {

    URL url = new URL(URLDecoder.decode(urlString, "utf-8"));
    URI u = url.toURI();

    HttpPost post = new HttpPost();
    post.setURI(u);

    MultipartEntity reqEntity = new MultipartEntity();
    StringBody sb = new StringBody(content, HTTP_CONTENT_TYPE_JSON, Charset.forName("UTF-8"));
    ByteArrayBody ib = new ByteArrayBody(image, HTTP_CONTENT_TYPE_JPEG, "image");

    reqEntity.addPart("interview_data", sb);
    reqEntity.addPart("interview_image", ib);
    post.setEntity(reqEntity);

    HttpResponse response = null;
    response = httpclient.execute(post, localContext);

    return response;
}

The problem is, MultipartEntity class only has isChunked() method (which always returns false), there is no "setChunked(boolean)" option if I wish to enable chucked encoding for my multipart entity.

My question is:

  1. Can HTTP multipart and chunking coexist according to protocol specification? If not, why other entities like InputStreamEntity class have setChunked(boolean) where MultipartEntity doesn't?

  2. Is there any way to post multiple files "at once" with chunking enabled, more preferably with apache libraries?

Younger answered 19/4, 2012 at 9:39 Comment(0)
Y
9

Got a solution for my second question, the trick is to write MultipartEntity to a ByteArrayOutputStream, create a ByteArrayEntity from ByteArrayOutputStream and enable chunking on that. Here's the the code:

    ByteArrayOutputStream bArrOS = new ByteArrayOutputStream();
    // reqEntity is the MultipartEntity instance
    reqEntity.writeTo(bArrOS);
    bArrOS.flush();
    ByteArrayEntity bArrEntity = new ByteArrayEntity(bArrOS.toByteArray());
    bArrOS.close();

    bArrEntity.setChunked(true);
    bArrEntity.setContentEncoding(reqEntity.getContentEncoding());
    bArrEntity.setContentType(reqEntity.getContentType());

    // Set ByteArrayEntity to HttpPost
    post.setEntity(bArrEntity);
Younger answered 19/4, 2012 at 10:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.