2012-04-19 15 views
7

Ich benutze Apache HttpClient zu post mehrere Dateien zum Server. Hier ist der Code:Können HTTP-Multipart und Chunking koexistieren?

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

Das Problem ist nur MultipartEntity Klasse isChunked() Methode (die immer false zurückgibt), gibt es keine „setChunked (boolean)“ Option, wenn ich wünsche geschmissen Codierung für meine mehrt Einheit zu ermöglichen.

Meine Frage ist:

  1. Kann HTTP mehrteiliger und Chunking koexistieren nach Protokollspezifikation? Wenn nicht, warum andere Entitäten wie InputStreamEntity Klasse haben setChunked(boolean) wo MultipartEntity nicht?

  2. Gibt es eine Möglichkeit, mehrere Dateien "auf einmal" zu veröffentlichen, wobei Chunking aktiviert ist, vorzugsweise mit Apache-Bibliotheken?

Antwort

8

eine Lösung für meine zweite Frage kam, ist der Trick MultipartEntity zu einem ByteArrayOutputStream zu schreiben, ein ByteArrayEntity von ByteArrayOutputStream und ermöglichen erstellen, die auf dem Chunking. Hier ist der 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);