Могут ли сосуществовать 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 для моей многочастной сущности.
Мой вопрос:
Могут ли HTTP-составные части и чанки сосуществовать в соответствии со спецификацией протокола? Если нет, то почему другим объектам нравится
InputStreamEntity
класс естьsetChunked(boolean)
гдеMultipartEntity
не делает?Есть ли способ опубликовать несколько файлов "сразу" с включенным чанкингом, более предпочтительно с библиотеками 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);