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

  • 相关阅读:
    Repeater嵌套绑定Repeater
    第一章 JavaScript概述
    一、mono for android学习:什么是mono for android(使用C#开发android)
    二、mono for Android学习:安装IDE 以及 可能遇到问题
    第三章 JavaScript 数据类型和值
    计算机是如何启动的?
    TSQL连接查询,基础连接理解
    三、mono for android 学习:参考书籍
    第二章 JavaScript 词法结构
    四、mono for android学习:在monodevelop与Visual Studio上的示例
  • 原文地址:https://www.cnblogs.com/jason1990/p/12551380.html
Copyright © 2011-2022 走看看