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

  • 相关阅读:
    BlockingQueue 原理 分析
    java引用 强引用,软引用,弱引用
    actomic cas无锁操作。
    MongoDB库设计原则及实践
    spring事物传播机制 事物隔离级别
    Hive UDAF介绍与开发
    [技术学习]js接口继承
    [技术学习]js继承
    [技术学习]正则表达式分析
    [技术学习]js正则表达式汇总
  • 原文地址:https://www.cnblogs.com/jason1990/p/12551380.html
Copyright © 2011-2022 走看看