Могут ли сосуществовать HTTP, состоящий из нескольких частей?

Я использую apache HttpClient разместить несколько файлов на сервере. Вот код:

    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 только класс isChunked() Метод (который всегда возвращает false), нет опции "setChunked(boolean)", если я хочу включить кодирование chucked для моей многочастной сущности.

Мой вопрос:

  1. Могут ли HTTP-составные части и чанки сосуществовать в соответствии со спецификацией протокола? Если нет, то почему другим объектам нравится InputStreamEntity класс есть setChunked(boolean) где MultipartEntity не делает?

  2. Есть ли способ опубликовать несколько файлов "сразу" с включенным чанкингом, более предпочтительно с библиотеками apache?

1 ответ

Решение

Есть решение для моего второго вопроса, хитрость заключается в том, чтобы написать MultipartEntity к ByteArrayOutputStream, создать ByteArrayEntity от ByteArrayOutputStream и включить чанкинг на это. Вот код:

    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);
Другие вопросы по тегам