Carregando MultipartFile com Spring RestTemplate

Carregando MultipartFile com Spring RestTemplate

1. Visão geral

Este tutorial rápido se concentra em como fazer upload de um arquivo com várias partes usando o RestTemplate do Spring.

Veremosa single file and multiple files – uploadusing the RestTemplate.

2. O que é uma solicitação multipart HTTP?

Simplificando, um corpo de solicitação HTTP POST básico mantém os dados do formulário em pares nome / valor.

Por outro lado, os clientes HTTP podem construir solicitações HTTP multiparte para enviar arquivos de texto ou binários ao servidor; é usado principalmente para fazer upload de arquivos.

Outro caso de uso comum é enviar o email com um anexo. As solicitações de arquivos com várias partes dividem um arquivo grande em partes menores e usam marcadores de limite para indicar o início e o fim do bloco.

Explore mais sobre solicitações de várias parteshere.

3. Dependência do Maven

Essa dependência única é suficiente para o aplicativo cliente:


    org.springframework
    spring-web
    5.0.7.RELEASE

4. OFile Upload Server

A API do servidor de arquivos expõe dois pontos de extremidade REST para fazer upload de arquivos únicos e múltiplos, respectivamente:

  • POST / fileserver / singlefileupload /

  • POST / fileserver / multiplefileupload /

5. Upload de um único arquivo

Primeiro, vamos versingle file upload using the RestTemplate.

Precisamos criarHttpEntitycom cabeçalho e corpo. Defina o valor do cabeçalhocontent-type paraMediaType.MULTIPART_FORM_DATA. Quando este cabeçalho é definido,RestTemplate empacota automaticamente os dados do arquivo junto com alguns metadados.

Os metadados incluem nome do arquivo, tamanho do arquivo e tipo de conteúdo do arquivo (por exemplotext/plain):

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

Em seguida, construa o corpo da solicitação como uma instância da classeLinkedMultiValueMap. LinkedMultiValueMap envolveLinkedHashMap armazenando vários valores para cada chave emLinkedList.

Em nosso exemplo, o métodogetTestFile( ) gera um arquivo fictício imediatamente e retorna umFileSystemResource:

MultiValueMap body
  = new LinkedMultiValueMap<>();
body.add("file", getTestFile());

Finalmente, construa uma instânciaHttpEntity que envolva o cabeçalho e o objeto body e poste-o usando umRestTemplate.

Observe que o upload de um único arquivo aponta para o endpoint/fileserver/singlefileupload/.

No final, a chamadarestTemplate.postForEntity( ) conclui o trabalho de conexão com o URL fornecido e envio do arquivo para o servidor:

HttpEntity> requestEntity
 = new HttpEntity<>(body, headers);

String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity response = restTemplate
  .postForEntity(serverUrl, requestEntity, String.class);

6. Upload de vários arquivos

No upload de vários arquivos, a única alteração do upload de um arquivo consiste na construção do corpo da solicitação.

Vamos criar vários arquivos eadd them with the same key emMultiValueMap.

Obviamente, o URL da solicitação deve se referir ao terminal para o upload de vários arquivos:

MultiValueMap body
  = new LinkedMultiValueMap<>();
body.add("files", getTestFile());
body.add("files", getTestFile());
body.add("files", getTestFile());

HttpEntity> requestEntity
  = new HttpEntity<>(body, headers);

String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity response = restTemplate
  .postForEntity(serverUrl, requestEntity, String.class);

Sempre é possívelmodel single file upload using the multiple file upload.

7. Conclusão

Concluindo, vimos um caso de transferência deMultipartFile usando SpringRestTemplate.

Como sempre, o código-fonte do cliente e do servidor de exemplo está disponívelover on GitHub.