搞定Multipart
Multipart解决了在一个HTTP请求里存放多种数据的问题,使得在一个HTTP请求里同时传输JSON和二进制数据成为可能,因此multipart大量应用在表单中。本文尝试用最简单的方式讲解在AJAX时代的multipart实践。
HTTP请求
Multipart有几个重要的点:
- 请求的Content-Type必须为multipart/form-data,后面必须跟用于区分各个part的boundary
- 每个part以boundary开始,后面跟Content-Disposition:form-data以及part的name,以及可选的filename
- 每个part有可选的Content-Type
前端
前端可以使用FormData来表示multipart
var formData = new FormData(); formData.append("username", "Groucho"); formData.append("accountnum", 123456); // number 123456 is immediately converted to a string "123456" // HTML file input, chosen by user formData.append("userfile", fileInputElement.files[0]); // JavaScript file-like object var content = '<a id="a"><b id="b">hey!</b></a>'; // the body of the new file... var blob = new Blob([content], { type: "text/xml"}); formData.append("webmasterfile", blob); var request = new XMLHttpRequest(); request.open("POST", "http://foo.com/submitform.php"); request.send(formData);
后端
以应用最广泛的的Spring Boot为例。
-
可以使用
@RequestParam
或者@RequestPart
来标记multipart中的part,两者的区别是,当参数类型不是String
或者Multipart
时,@RequestParam
使用Converter
或者PropertyEditor
进行转换,而@RequestPart
使用HttpMessageConverters
进行转换。HTTPMessageConverters
依赖Content-Type
来选择converter,同时@RequestBody
也使用HTTPMessageConverters
。因此,如果参数是key=value
形式的,选择@RequestParam
,如果参数是JSON或者XML,选择@RequestPart
-
由于
HTTPMessageConverters
依赖Content-Type
,因此对于非String
/MultipartFile
/Part
类型的参数,必须在请求中指定Content-Type
,前端指定Content-Type
的方法见代码示例 -
由于自己实现
Converter
或者PropertyEditor
也是有一定代码量的,而且现在都用JSON传输数据,所以更推荐使用@RequestPart
PS:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
来源:https://www.cnblogs.com/jason1990/p/12551380.html