2012-04-19 13 views
7

Sto usando apache HttpClient a post diversi file sul server. Ecco il codice:Possono coesistere HTTP multipart e chunking?

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

Il problema è, MultipartEntity classe ha solo isChunked() metodo (che restituisce sempre false), non v'è alcuna "setChunked (boolean)" se voglio abilitare la codifica buttato per la mia entità multipart.

La mia domanda è:

  1. Può HTTP coesistono più parti e la suddivisione in blocchi in base alle specifiche del protocollo? In caso contrario, perché altre entità come la classe InputStreamEntity hanno MultipartEntity dove MultipartEntity non esiste?

  2. C'è un modo per pubblicare più file "alla volta" con chunking abilitato, più preferibilmente con le librerie di apache?

risposta

8

Hai una soluzione per il mio secondo quesito, il trucco è quello di scrivere MultipartEntity ad un ByteArrayOutputStream, creare una ByteArrayEntity da ByteArrayOutputStream e abilitare suddivisione in blocchi su questo. Ecco il codice:

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