MultipartFile mit Spring RestTemplate hochladen

Hochladen von MultipartFile mit Spring RestTemplate

1. Überblick

Dieses kurze Tutorial befasst sich mit dem Hochladen einer mehrteiligen Datei mit Spring's RestTemplate.

Wir werden beidea single file and multiple files – uploadusing the RestTemplate. sehen

2. Was ist eine HTTP Multipart-Anfrage?

Einfach ausgedrückt, enthält ein grundlegender HTTP-POST-Anforderungshauptteil Formulardaten in Name / Wert-Paaren.

Auf der anderen Seite können HTTP-Clients mehrteilige HTTP-Anforderungen erstellen, um Text- oder Binärdateien an den Server zu senden. Es wird hauptsächlich zum Hochladen von Dateien verwendet.

Ein weiterer häufiger Anwendungsfall ist das Senden der E-Mail mit einem Anhang. Mehrteilige Dateianforderungen teilen eine große Datei in kleinere Abschnitte auf und verwenden Begrenzungsmarkierungen, um den Anfang und das Ende des Blocks anzugeben.

Erfahren Sie mehr über mehrteilige Anforderungenhere.

3. Maven-Abhängigkeit

Diese einzige Abhängigkeit reicht für die Client-Anwendung aus:


    org.springframework
    spring-web
    5.0.7.RELEASE

4. DieFile Upload Server

Die Dateiserver-API stellt zwei REST-Endpunkte zum Hochladen einzelner bzw. mehrerer Dateien bereit:

  • POST / fileserver / singlefileupload /

  • POST / fileserver / multiplefileupload /

5. Eine einzelne Datei hochladen

Lassen Sie uns zuerstsingle file upload using the RestTemplate. sehen

Wir müssenHttpEntitymit Header und Body erstellen. Setzen Sie den Header-Wert voncontent-type aufMediaType.MULTIPART_FORM_DATA. Wenn dieser Header gesetzt ist, sammeltRestTemplate automatisch die Dateidaten zusammen mit einigen Metadaten.

Zu den Metadaten gehören Dateiname, Dateigröße und Dateiinhaltstyp (z. B.text/plain):

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

Erstellen Sie als Nächstes den Anforderungshauptteil als Instanz der KlasseLinkedMultiValueMap. LinkedMultiValueMap umschließtLinkedHashMap und speichert mehrere Werte für jeden Schlüssel inLinkedList.

In unserem Beispiel generiert die MethodegetTestFile( ) im laufenden Betrieb eine Dummy-Datei und gibtFileSystemResource zurück:

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

Erstellen Sie abschließend eineHttpEntity-Instanz, die den Header und das Body-Objekt umschließt, und veröffentlichen Sie sie mitRestTemplate.

Beachten Sie, dass der Upload einer einzelnen Datei auf den Endpunkt von/fileserver/singlefileupload/verweist.

Am Ende beendet der AufrufrestTemplate.postForEntity( ) die Verbindung mit der angegebenen URL und das Senden der Datei an den Server:

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. Mehrere Dateien hochladen

Beim Hochladen mehrerer Dateien besteht die einzige Änderung gegenüber dem Hochladen einzelner Dateien darin, den Hauptteil der Anforderung zu erstellen.

Erstellen wir mehrere Dateien undadd them with the same key inMultiValueMap.

Offensichtlich sollte die Anforderungs-URL für das Hochladen mehrerer Dateien auf den Endpunkt verweisen:

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

Es ist immer möglich,model single file upload using the multiple file upload.

7. Fazit

Zusammenfassend haben wir einen Fall vonMultipartFile Übertragung unter Verwendung von SpringRestTemplate gesehen.

Wie immer ist der Beispiel-Client- und Server-Quellcodeover on GitHub verfügbar.