So habe ich Spring MVC Multipart Request mit JSON-Daten implementiert.
Multipart-Anfrage mit JSON-Daten (auch Mixed Multipart genannt):
Basierend auf dem RESTful-Dienst in Spring 4.0.2 Release kann eine HTTP-Anforderung mit dem ersten Teil als XML- oder JSON-formatierte Daten und dem zweiten Teil als Datei mit @RequestPart ausgeführt werden. Unten finden Sie die Beispielimplementierung.
Java-Snippet:
Der Restdienst in Controller verfügt über gemischte @RequestPart- und MultipartFile-Dateien, um eine solche Multipart + JSON-Anforderung zu bedienen.
@RequestMapping(value = "/executesampleservice", method = RequestMethod.POST,
consumes = {"multipart/form-data"})
@ResponseBody
public boolean executeSampleService(
@RequestPart("properties") @Valid ConnectionProperties properties,
@RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file) {
return projectService.executeSampleService(properties, file);
}
Front-End-Snippet (JavaScript):
Erstellen Sie ein FormData-Objekt.
Hängen Sie die Datei mit einem der folgenden Schritte an das FormData-Objekt an.
- Wenn die Datei mit einem Eingabeelement vom Typ "Datei" hochgeladen wurde, hängen Sie sie an das FormData-Objekt an.
formData.append("file", document.forms[formName].file.files[0]);
- Hängen Sie die Datei direkt an das FormData-Objekt an.
formData.append("file", myFile, "myfile.txt");
ODERformData.append("file", myBob, "myfile.txt");
Erstellen Sie einen Blob mit den stringifizierten JSON-Daten und hängen Sie ihn an das FormData-Objekt an. Dies bewirkt, dass der Inhaltstyp des zweiten Teils in der mehrteiligen Anforderung "application / json" anstelle des Dateityps ist.
Senden Sie die Anfrage an den Server.
Details anfordern :
Content-Type: undefined
. Dies bewirkt, dass der Browser den Inhaltstyp auf Mehrteil- / Formulardaten setzt und die Grenze korrekt ausfüllt. Wenn Sie Content-Type manuell auf Multipart- / Formulardaten einstellen, wird der Grenzparameter der Anforderung nicht ausgefüllt.
Javascript Code:
formData = new FormData();
formData.append("file", document.forms[formName].file.files[0]);
formData.append('properties', new Blob([JSON.stringify({
"name": "root",
"password": "root"
})], {
type: "application/json"
}));
Anfragedetails:
method: "POST",
headers: {
"Content-Type": undefined
},
data: formData
Nutzlast anfordern:
Accept:application/json, text/plain, */*
Content-Type:multipart/form-data; boundary=
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: application/txt
Content-Disposition: form-data; name="properties"; filename="blob"
Content-Type: application/json
org.springframework.web.multipart.commons.CommonsMultipartResolver
in Ihrem Servlet-Kontext ein angegeben?