2012-04-19 18 views
7

Estoy usando apache HttpClient a publicar varios archivos al servidor. Aquí está el código:¿Pueden coexistir multiparte y fragmentación 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; 
} 

El problema es, MultipartEntity clase sólo tiene isChunked() método (que siempre devuelve falso), no hay un "setChunked (booleano)" opción si deseo activar la codificación de chucked para mi entidad multiparte.

Mi pregunta es:

  1. Puede HTTP coexisten varias partes y la fragmentación de acuerdo con la especificación del protocolo? Si no, ¿por qué otras entidades como la clase InputStreamEntity tienen setChunked(boolean) donde MultipartEntity no?

  2. ¿Hay alguna forma de publicar varios archivos "a la vez" con la fragmentación habilitada, más preferiblemente con las bibliotecas apache?

Respuesta

8

¿Qué soluciones para la segunda pregunta, el truco consiste en escribir MultipartEntity a un ByteArrayOutputStream, crear un ByteArrayEntity de ByteArrayOutputStream y permitir fragmentación en eso. Aquí está el código:

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