これが、JSONデータを使用してSpringMVCマルチパートリクエストを実装した方法です。
JSONデータを使用したマルチパートリクエスト(混合マルチパートとも呼ばれます):
Spring 4.0.2リリースのRESTfulサービスに基づいて、最初の部分をXMLまたはJSON形式のデータとして、2番目の部分をファイルとして使用するHTTPリクエストは、@ RequestPartを使用して実現できます。以下はサンプル実装です。
Javaスニペット:
ControllerのRESTサービスでは、@ RequestPartとMultipartFileを組み合わせて、このような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);
}
フロントエンド(JavaScript)スニペット:
FormDataオブジェクトを作成します。
以下のいずれかの手順を使用して、ファイルをFormDataオブジェクトに追加します。
- 「file」タイプの入力要素を使用してファイルがアップロードされている場合は、それをFormDataオブジェクトに追加します。
formData.append("file", document.forms[formName].file.files[0]);
- ファイルをFormDataオブジェクトに直接追加します。
formData.append("file", myFile, "myfile.txt");
またはformData.append("file", myBob, "myfile.txt");
文字列化されたJSONデータを使用してblobを作成し、FormDataオブジェクトに追加します。これにより、マルチパートリクエストの2番目のパートのコンテンツタイプがファイルタイプではなく「application / json」になります。
サーバーにリクエストを送信します。
リクエストの詳細:
Content-Type: undefined
。これにより、ブラウザはContent-Typeをmultipart / form-dataに設定し、境界を正しく埋めます。Content-Typeをmultipart / form-dataに手動で設定すると、リクエストの境界パラメーターを入力できなくなります。
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"
}));
リクエストの詳細:
method: "POST",
headers: {
"Content-Type": undefined
},
data: formData
ペイロードのリクエスト:
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
サーブレットコンテキストでを指定しましたか?