搞定Multipart

2020-03-23 05:36:47来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

搞定Multipart

从前后端解析Multipart使用方式。

搞定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
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Spring生命周期详解

下一篇:Maven实现热部署需要的依赖