2012-04-19 19 views
7

私はApacheを使用していますHttpClient投稿複数のファイルをサーバーに送ります。HTTPマルチパートとチャンクが混在できますか?

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クラスのみ(常にfalseを返す)isChunked()メソッドを持って、私は私のマルチパートエンティティのチャッキングエンコーディングを有効にしたい場合は、何も「setChunked(ブール値)」オプションはありません。ここでは、コードです。

私の質問は:

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

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

答えて

8

は、トリックは、ByteArrayOutputStreamMultipartEntityを書くByteArrayOutputStreamからByteArrayEntityを作成し、その上でチャンキング有効にすることです、私の2番目の質問のためのソリューションを手に入れました。コードは次のとおりです。

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); 
関連する問題