2012-04-19 17 views
7

Używam kilku plików na serwer Apache HttpClient do po. Oto kod:Czy wieloczęściowy HTTP i współistnienie chunków?

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

Problem polega na tym, MultipartEntity klasa ma tylko isChunked() metodę (który zawsze zwraca false), nie ma „setChunked (logiczna)” opcja, jeśli chcesz włączyć chucked kodowanie moim wieloczęściowy podmiotu.

Moje pytanie brzmi:

  1. Can formacie HTTP wieloczęściowy i wyrwy współistnieją zgodnie ze specyfikacją protokołu? Jeśli nie, to dlaczego inne podmioty, takie jak InputStreamEntity, mają setChunked(boolean), gdzie MultipartEntity nie?

  2. Czy istnieje sposób na opublikowanie wielu plików "naraz" z włączoną funkcją chunking, a najlepiej z bibliotekami apache?

Odpowiedz

8

Got rozwiązanie dla mojego drugiego pytania, sztuką jest napisać MultipartEntity do ByteArrayOutputStream utwórz ByteArrayEntity z ByteArrayOutputStream i umożliwić wyrwy w tej sprawie. Oto kod:

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