Многокомпонентная загрузка с HttpClient 4

Многокомпонентная загрузка с HttpClient 4

1. обзор

В этом руководстве мы покажем, как выполнятьa multipart upload operation using HttpClient 4.

Мы будем использоватьhttp://echo.200please.com в качестве тестового сервера, поскольку он общедоступный и принимает большинство типов контента.

Если хотите копнуть глубже иlearn other cool things you can do with the HttpClient - переходите кthe main HttpClient tutorial.

2. Использование методаAddPart

Давайте начнем с просмотра объектаMultipartEntityBuilder вadd parts to an Http entity, который затем будет загружен с помощью операции POST.

Это общий метод добавления частей кHttpEntity, представляющему форму.

Пример 2.1. -Uploading a Form with Two Text Parts and a File

File file = new File(textFileName);
HttpPost post = new HttpPost("http://echo.200please.com");
FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY);
StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA);
StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA);
//
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("upfile", fileBody);
builder.addPart("text1", stringBody1);
builder.addPart("text2", stringBody2);
HttpEntity entity = builder.build();
//
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание, что мы создаем экземпляр объектаFile, также указывая значениеContentType, которое будет использоваться сервером.

Также обратите внимание, что методaddPart имеет два аргумента, действующих как парыkey/value для формы. Они актуальны только в том случае, если серверная сторона действительно ожидает и использует имена параметров - в противном случае они просто игнорируются.

3. Использование методовaddBinaryBody иaddTextBody

Более прямой способ создать составную сущность - использовать методыaddBinaryBody иAddTextBody. Эти методы работают для загрузки текста, файлов, массивов символов и объектовInputStream. Давайте проиллюстрируем это на простых примерах.

Пример 3.1. -Uploading Text and a Text File Part

HttpPost post = new HttpPost("http://echo.200please.com");
File file = new File(textFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName);
builder.addTextBody("text", message, ContentType.DEFAULT_BINARY);
//
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание, что объектыFileBody иStringBody здесь не нужны.

Также важно, что большинство серверов не проверяютContentType тела текста, поэтому методaddTextBody может опустить значениеContentType.

APIaddBinaryBody принимаетContentType, ноis also позволяет создать объект только из двоичного тела и имени параметра формы, содержащего файл. Как было сказано в предыдущем разделе, некоторые серверы не распознают файл, если не указано значениеContentType.

Затем мы добавим zip-файл какInputStream,, а файл изображения будет добавлен как объектFile:

Пример 3.2. -Uploading a __ Zip File, an Image File, and a Text Part

HttpPost post = new HttpPost("http://echo.200please.com");
InputStream inputStream = new FileInputStream(zipFileName);
File file = new File(imageFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody
  ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName);
builder.addBinaryBody
  ("upstream", inputStream, ContentType.create("application/zip"), zipFileName);
builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
//
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание, что значениеContentType может быть создано «на лету», как в примере выше для zip-файла.

Наконец, не все серверы подтверждают частиInputStream. Сервер, который мы создали в первой строке кода, распознаетInputStreams.

Давайте теперь посмотрим на другой пример, гдеaddBinaryBody работает напрямую с байтовым массивом:

Пример 3.3. -Uploading a Byte Array and Text

HttpPost post = new HttpPost("http://echo.200please.com");
String message = "This is a multipart post";
byte[] bytes = "binary code".getBytes();
//
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName);
builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
//
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Обратите внимание наContentType, который теперь указывает двоичные данные.

4. Заключение

В этой статьеMultipartEntityBuilder представлен как гибкий объект, который предлагает несколько вариантов API для создания составной формы.

Примеры также показали, как использоватьHttpClient для загрузкиa HttpEntity, похожего на сущность формы.

Реализация всех этих примеров и фрагментов кодаcan be found in our GitHub project - это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.