Upload de várias partes com o HttpClient 4
1. Visão geral
Neste tutorial, ilustraremos como fazera multipart upload operation using HttpClient 4.
Usaremoshttp://echo.200please.com como servidor de teste porque é público e aceita a maioria dos tipos de conteúdo.
Se você quiser ir mais fundo elearn other cool things you can do with the HttpClient, vá parathe main HttpClient tutorial.
2. Usando o métodoAddPart
Vamos começar observando o objetoMultipartEntityBuilder paraadd parts to an Http entity que será enviado por meio de uma operação POST.
Este é um método genérico para adicionar partes a umHttpEntity que representa o formulário.
Exemplo 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);
Observe que estamos instanciando o objetoFile especificando também o valorContentType a ser usado pelo servidor.
Além disso, observe que o métodoaddPart tem dois argumentos, agindo como pareskey/value para o formulário. Eles são relevantes apenas se o lado do servidor realmente espera e usa nomes de parâmetros - caso contrário, eles são simplesmente ignorados.
3. Usando os métodosaddBinaryBodyeaddTextBody
Uma maneira mais direta de criar uma entidade multiparte é usar os métodosaddBinaryBodyeAddTextBody. Esses métodos funcionam para enviar texto, arquivos, matrizes de caracteres e objetosInputStream. Vamos ilustrar como com exemplos simples.
Exemplo 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);
Observe que os objetosFileBodyeStringBody não são necessários aqui.
Também importante, a maioria dos servidores não verifica oContentType do corpo do texto, portanto, o métodoaddTextBody pode omitir o valorContentType.
A APIaddBinaryBody aceita umContentType - mas éis also possível criar a entidade apenas a partir de um corpo binário e o nome do parâmetro de formulário que contém o arquivo. Conforme declarado na seção anterior, alguns servidores não reconhecerão o arquivo se o valorContentType não for especificado.
A seguir, adicionaremos um arquivo zip comoInputStream,, enquanto o arquivo de imagem será adicionado como objetoFile:
Exemplo 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);
Observe que o valorContentType pode ser criado imediatamente, como é o caso no exemplo acima para o arquivo zip.
Por fim, nem todos os servidores reconhecemInputStream partes. O servidor que instanciamos na primeira linha do código reconheceInputStreams.
Vejamos agora outro exemplo em queaddBinaryBody está trabalhando diretamente com uma matriz de bytes:
Exemplo 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);
Observe oContentType - que agora especifica dados binários.
4. Conclusão
Este artigo apresentou oMultipartEntityBuilder como um objeto flexível que oferece várias opções de API para criar um formulário com várias partes.
Os exemplos também mostraram como usarHttpClient para fazer upload dea HttpEntity que é semelhante a uma entidade de formulário.
A implementação de todos esses exemplos e fragmentos de códigocan be found in our GitHub project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.