Téléchargement de fichiers multipart avec Spring RestTemplate

Téléchargement de fichiers multipart avec Spring RestTemplate

1. Vue d'ensemble

Ce didacticiel rapide explique comment télécharger un fichier en plusieurs parties à l’aide de ResteTemplate de Spring.

Nous verrons les deuxa single file and multiple files – uploadusing the RestTemplate.

2. Qu'est-ce qu'une demande multipart HTTP?

En termes simples, un corps de requête HTTP POST de base contient les données de formulaire sous forme de paires nom / valeur.

D'un autre côté, les clients HTTP peuvent construire des requêtes HTTP en plusieurs parties pour envoyer du texte ou des fichiers binaires au serveur; il est principalement utilisé pour télécharger des fichiers.

Un autre cas d'utilisation courant consiste à envoyer le courrier électronique avec une pièce jointe. Les demandes de fichier en plusieurs parties divisent un fichier volumineux en fragments plus petits et utilisent des repères de délimitation pour indiquer le début et la fin du bloc.

En savoir plus sur les requêtes en plusieurs partieshere.

3. Dépendance Maven

Cette dépendance unique suffit pour l'application cliente:


    org.springframework
    spring-web
    5.0.7.RELEASE

4. LesFile Upload Server

L'API du serveur de fichiers expose deux points de terminaison REST pour le téléchargement de fichiers uniques et multiples:

  • POST / fileserver / singlefileupload /

  • POST / fileserver / multiplefileupload /

5. Télécharger un seul fichier

Voyons d'abordsingle file upload using the RestTemplate.

Nous devons créer l'en-tête et le corps du swithHttpEntity. Définissez la valeur d'en-têtecontent-type surMediaType.MULTIPART_FORM_DATA. Lorsque cet en-tête est défini,RestTemplate rassemble automatiquement les données du fichier avec certaines métadonnées.

Les métadonnées incluent le nom du fichier, la taille du fichier et le type de contenu du fichier (par exempletext/plain):

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

Ensuite, créez le corps de la requête en tant qu'instance de la classeLinkedMultiValueMap. LinkedMultiValueMap encapsuleLinkedHashMap en stockant plusieurs valeurs pour chaque clé dans unLinkedList.

Dans notre exemple, la méthodegetTestFile( ) génère un fichier factice à la volée et renvoie unFileSystemResource:

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

Enfin, construisez une instanceHttpEntity qui encapsule l'en-tête et l'objet body et publiez-la en utilisant unRestTemplate.

Notez que le téléchargement de fichier unique pointe vers le point de terminaison/fileserver/singlefileupload/.

En fin de compte, l'appelrestTemplate.postForEntity( ) termine le travail de connexion à l'URL donnée et d'envoi du fichier au serveur:

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. Téléchargement de plusieurs fichiers

Lors du téléchargement de plusieurs fichiers, le seul changement par rapport au téléchargement de fichier unique réside dans la construction du corps de la demande.

Créons plusieurs fichiers etadd them with the same key dansMultiValueMap.

De toute évidence, l'URL de la demande doit faire référence au point de terminaison pour le téléchargement de plusieurs fichiers:

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);

Il est toujours possible demodel single file upload using the multiple file upload.

7. Conclusion

En conclusion, nous avons vu un cas de transfert deMultipartFile utilisant SpringRestTemplate.

Comme toujours, l'exemple de code source client et serveur est disponibleover on GitHub.