MultipartFile uploaden met Spring RestTemplate

1. Overzicht

Deze korte tutorial richt zich op het uploaden van een meerdelig bestand met Spring's RestTemplate.

We zullen beide zien een enkel bestand en meerdere bestanden - uploadmet behulp van de RestTemplate.

2. Wat is een HTTP Multipart Request?

Simpel gezegd, een standaard HTTP POST-aanvraagbody bevat formuliergegevens in naam / waarde-paren.

Aan de andere kant kunnen HTTP-clients HTTP-meerdelige verzoeken construeren om tekst- of binaire bestanden naar de server te sturen; het wordt voornamelijk gebruikt voor het uploaden van bestanden.

Een andere veel voorkomende use-case is het verzenden van de e-mail met een bijlage. Meerdelige bestandsverzoeken splitsen een groot bestand op in kleinere stukken en gebruiken grensmarkeringen om het begin en het einde van het blok aan te geven.

Lees hier meer over meerdelige verzoeken.

3. Maven Afhankelijkheid

Deze enkele afhankelijkheid is voldoende voor de clienttoepassing:

 org.springframework spring-web 5.2.2.RELEASE 

4. Het Server voor het uploaden van bestanden

De bestandsserver-API stelt twee REST-eindpunten bloot voor het uploaden van respectievelijk enkele en meerdere bestanden:

  • POST / fileserver / singlefileupload /
  • POST / fileserver / multiplefileupload /

5. Uploaden van een enkel bestand

Laten we eerst eens kijken enkel bestand uploaden met behulp van de RestTemplate.

We moeten creëren HttpEntitymet header en body. Stel de inhoudstype koptekstwaarde naar Mediatype.MULTIPART_FORM_DATA. Wanneer deze koptekst is ingesteld, RestTemplate rangschikt automatisch de bestandsgegevens samen met enkele metagegevens.

Metagegevens omvatten bestandsnaam, bestandsgrootte en bestandstype (bijvoorbeeld tekst / gewoon):

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

Bouw vervolgens de hoofdtekst van het verzoek als een instantie van LinkedMultiValueMap klasse. LinkedMultiValueMap wraps LinkedHashMap het opslaan van meerdere waarden voor elke sleutel in een LinkedList.

In ons voorbeeld is de getTestFile () methode genereert direct een dummy-bestand en retourneert een FileSystemResource:

MultiValueMap body = nieuwe LinkedMultiValueMap (); body.add ("bestand", getTestFile ());

Bouw ten slotte een HttpEntity instantie die de header en het body-object omhult en plaatst met een RestTemplate.

Merk op dat het uploaden van een enkel bestand verwijst naar het / fileserver / singlefileupload / eindpunt.

Uiteindelijk is het telefoontje restTemplate.postForEntity () voltooit de taak van het verbinden met de opgegeven URL en het verzenden van het bestand naar de server:

HttpEntity requestEntity = nieuwe HttpEntity (body, headers); String serverUrl = "// localhost: 8082 / spring-rest / fileserver / singlefileupload /"; RestTemplate restTemplate = nieuwe RestTemplate (); ResponseEntity response = restTemplate .postForEntity (serverUrl, requestEntity, String.class);

6. Meerdere bestanden uploaden

Bij het uploaden van meerdere bestanden is de enige verandering ten opzichte van het uploaden van één bestand het samenstellen van de hoofdtekst van het verzoek.

Laten we meerdere bestanden maken en voeg ze toe met dezelfde sleutel in MultiValueMap.

Het is duidelijk dat de verzoek-URL moet verwijzen naar het eindpunt voor het uploaden van meerdere bestanden:

MultiValueMap body = nieuwe LinkedMultiValueMap (); body.add ("bestanden", getTestFile ()); body.add ("bestanden", getTestFile ()); body.add ("bestanden", getTestFile ()); HttpEntity requestEntity = nieuwe HttpEntity (body, headers); String serverUrl = "// localhost: 8082 / spring-rest / fileserver / multiplefileupload /"; RestTemplate restTemplate = nieuwe RestTemplate (); ResponseEntity response = restTemplate .postForEntity (serverUrl, requestEntity, String.class);

Het is altijd mogelijk model uploaden van één bestand met behulp van uploaden van meerdere bestanden.

7. Conclusie

Tot slot zagen we een geval van MultipartFile overdracht met behulp van Spring RestTemplate.

Zoals altijd is de broncode van de voorbeeldclient en -server beschikbaar op GitHub.