9

私はapacheHttpClientを使用していくつかのファイルをサーバーに投稿しています。コードは次のとおりです。

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

問題は、MultipartEntityクラスにはisChunked()メソッド(常にfalseを返す)しかなく、マルチパートエンティティのチャックされたエンコーディングを有効にする場合は「setChunked(boolean)」オプションがないことです。

私の質問は:

  1. プロトコル仕様に従って、HTTPマルチパートとチャンクを共存させることはできますか?そうでない場合、なぜInputStreamEntityクラスのような他のエンティティsetChunked(boolean)MultipartEntityはないのですか?

  2. チャンクを有効にして、より好ましくはapacheライブラリを使用して、複数のファイルを「一度に」投稿する方法はありますか?

4

1 に答える 1

9

私の2番目の質問の解決策を得ました。秘訣は、に書き込みMultipartEntity、fromをByteArrayOutputStream作成し、その上でチャンクを有効にすることです。コードは次のとおりです。ByteArrayEntityByteArrayOutputStream

    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);
于 2012-04-19T10:14:14.347 に答える