W ten sposób zaimplementowałem Spring MVC Multipart Request z danymi JSON.
Żądanie wieloczęściowe z danymi JSON (nazywane również Wieloczęściowym mieszanym):
Opierając się na usłudze RESTful w wydaniu Spring 4.0.2, żądanie HTTP z pierwszą częścią jako dane w formacie XML lub JSON, a drugą częścią jako plik można uzyskać za pomocą @RequestPart. Poniżej znajduje się przykładowa realizacja.
Fragment Java:
Usługa Rest w kontrolerze będzie miała mieszane @RequestPart i MultipartFile do obsługi takiego żądania Multipart + JSON.
@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);
}
Fragment interfejsu (JavaScript):
Utwórz obiekt FormData.
Dołącz plik do obiektu FormData, wykonując jeden z poniższych kroków.
- Jeśli plik został przesłany przy użyciu elementu wejściowego typu „plik”, dołącz go do obiektu FormData.
formData.append("file", document.forms[formName].file.files[0]);
- Bezpośrednio dołącz plik do obiektu FormData.
formData.append("file", myFile, "myfile.txt");
LUBformData.append("file", myBob, "myfile.txt");
Utwórz obiekt BLOB ze zdefiniowanymi danymi JSON i dołącz go do obiektu FormData. Powoduje to, że typ zawartości drugiej części w żądaniu wieloczęściowym to „application / json” zamiast typu pliku.
Wyślij żądanie do serwera.
Poproś o szczegóły:
Content-Type: undefined
. Powoduje to, że przeglądarka ustawia Content-Type na multipart / form-data i prawidłowo wypełnia granice. Ręczne ustawienie Content-Type na multipart / form-data nie spowoduje wypełnienia parametru brzegowego żądania.
Kod JavaScript:
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"
}));
Szczegóły prośby:
method: "POST",
headers: {
"Content-Type": undefined
},
data: formData
Poproś o ładunek:
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
w kontekście swojego serwletu?