这就是我使用 JSON 数据实现 Spring MVC 多部分请求的方式。
带有 JSON 数据的多部分请求(也称为混合多部分):
基于 Spring 4.0.2 Release 中的 RESTful 服务,可以通过 @RequestPart 实现 HTTP 请求的第一部分为 XML 或 JSON 格式的数据,第二部分为文件。下面是示例实现。
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 对象。
- 如果文件已使用“文件”类型的输入元素上传,则将其附加到 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 对象。这会导致多部分请求中第二部分的 Content-type 为“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=----WebKitFormBoundaryEBoJzS3HQ4PgE1QB
------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: application/txt
------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="properties"; filename="blob"
Content-Type: application/json
------WebKitFormBoundaryvijcWI2ZrZQ8xEBN--