18.10.5处理来自编程客户端的文件上传请求

也可以从RESTful服务场景中的非浏览器客户端提交多部分请求。 以上所有示例和配置都适用于此。 但是,与通常提交文件和简单表单域的浏览器不同,编程客户机还可以发送更复杂的特定内容类型的数据 - 例如带文件的多部分请求,带JSON格式数据的第二部分:

POST /someUrl
Content-Type: multipart/mixed

--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="meta-data"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit

{
    "name": "value"
}
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="file-data"; filename="file.properties"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
... File Data ...

You could access the part named "meta-data" with a@RequestParam("meta-data") String metadatacontroller method argument. However, you would probably prefer to accept a strongly typed object initialized from the JSON formatted data in the body of the request part, very similar to the way@RequestBodyconverts the body of a non-multipart request to a target object with the help of anHttpMessageConverter.

You can use the@RequestPartannotation instead of the@RequestParamannotation for this purpose. It allows you to have the content of a specific multipart passed through anHttpMessageConvertertaking into consideration the'Content-Type'header of the multipart:

您可以使用@RequestParam("meta-data") String metadata控制器方法参数来访问名为"meta-data" 的部分。 但是,您可能更愿意接受一个从请求部分主体中的JSON格式的数据初始化的强类型对象,这与@RequestBody在非帮助的情况下将非多部分请求的主体转换为目标对象的方式非常相似 一个HttpMessageConverter

您可以使用@RequestPart注解而不是@RequestParam注解来达到此目的。 它允许您通过HttpMessageConverter考虑多部分的'Content-Type'标题来传递特定多部分的内容:

@PostMapping("/someUrl")
public String onSubmit(@RequestPart("meta-data") MetaData metadata,
        @RequestPart("file-data") MultipartFile file) {

    // ...

}

请注意,MultipartFile方法参数如何通过@RequestParam@RequestPart可互换地访问。 然而,在这种情况下,@RequestPart("meta-data") MetaData方法参数被读取为基于其'Content-Type'头的JSON内容,并且借助于MappingJackson2HttpMessageConverter进行转换。

results matching ""

    No results matching ""