Hochladen von MultipartFile mit Spring RestTemplate

1. Übersicht

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

Wir sehen sowohl eine einzelne Datei als auch mehrere Dateien - das Hochladen mit der RestTemplate.

2. Was ist eine mehrteilige HTTP-Anforderung?

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

Andererseits 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 Teile auf und verwenden Begrenzungsmarkierungen, um den Anfang und das Ende des Blocks anzuzeigen.

Erfahren Sie hier mehr über mehrteilige Anfragen.

3. Maven-Abhängigkeit

Diese einzelne Abhängigkeit reicht für die Clientanwendung aus:

 org.springframework spring-web 5.2.2.RELEASE 

4. Der Datei-Upload-Server

Die Dateiserver-API stellt zwei REST-Endpunkte für das Hochladen einzelner bzw. mehrerer Dateien bereit:

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

5. Hochladen einer einzelnen Datei

Lassen Sie uns zunächst den Upload einzelner Dateien mithilfe der RestTemplate sehen.

Wir müssen HttpEntity mit Header und Body erstellen . Setzen Sie den Headerwert für den Inhaltstyp auf MediaType.MULTIPART_FORM_DATA . Wenn dieser Header festgelegt ist, sammelt RestTemplate automatisch die Dateidaten zusammen mit einigen Metadaten.

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

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

Erstellen Sie als Nächstes den Anforderungshauptteil als Instanz der LinkedMultiValueMap- Klasse. LinkedMultiValueMap Wraps LinkedHashMap Speichern mehrerer Werte für jede Taste in einem VerketteteListe .

In unserem Beispiel generiert die Methode getTestFile () im laufenden Betrieb eine Dummy-Datei und gibt eine FileSystemResource zurück :

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

Erstellen Sie abschließend eine HttpEntity- Instanz, die den Header und das Body-Objekt umschließt, und veröffentlichen Sie sie mithilfe einer RestTemplate .

Beachten Sie, dass der Upload einzelner Dateien auf / fileserver / singlefileupload / endpoint verweist .

Am Ende schließt der Aufruf restTemplate.postForEntity () die Verbindung mit der angegebenen URL und das Senden der Datei an den Server ab:

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

6. Hochladen mehrerer Dateien

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

Lassen Sie uns mehrere Dateien erstellen und diese mit demselben Schlüssel in MultiValueMap hinzufügen .

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

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

Es ist immer möglich, das Hochladen einzelner Dateien mithilfe des Hochladens mehrerer Dateien zu modellieren.

7. Fazit

Zusammenfassend haben wir einen Fall von MultipartFile- Übertragung mit Spring RestTemplate gesehen .

Wie immer ist der Beispiel-Client- und Server-Quellcode auf GitHub verfügbar.