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.