搞定Multipart

安稳与你 提交于 2020-03-23 13:33:59

搞定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:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
程序员打怪之路

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!