Multipart解决了在一个HTTP请求里存放多种数据的问题,使得在一个HTTP请求里同时传输JSON和二进制数据成为可能,因此multipart大量应用在表单中。本文尝试用最简单的方式讲解在AJAX时代的multipart实践。
Multipart有几个重要的点:
前端可以使用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