介绍
先看看 MDN 对FormData
的介绍:
XMLHttpRequest Level2添加了一个新的接口FormData. 利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件.
特点就是,增加了ajax
对二进制文件上传的支持。比如:
var formData = new FormData();
formData.append("username", "sam");
// 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", url);
request.send(formData);
这个例子既有File
,还有Blob
类型文件,利用FormData
能轻松的进行异步上传。
请求头部
可以看到 Content-Type
为:
multipart/form-data; boundary=----WebKitFormBoundary2KZkAN7R3gSDjBJz
图中没有看到 file
的二进制文件
请求主体
每个参数包括:
第一行,“分界线”,图中
chrome
的分界线是:“——WebKitFormBoundary”加16位随机Base64
位编码的字符串作为分隔边界第二行,内容配置,指明
form-data
,和name
键名称第三行,指明
content-type
第三行或第四行,空行
注意,整个body结束最后,多了一个分界线。
分析一下请求信息,发现这种提交方式与form
表单提交是一样的,比如:
<form enctype="multipart/form-data" method="post" action="">
<input name="username" value="sam1">username</input>
<button type="submit">提交</button>
</form>
兼容性
由图可见,FormData
在移动端,对低版本的 Android 设备支持不够友好。
我们知道,在ajax
请求中,send
函数会自动生成请求头和请求主体。所以,send(formData)
浏览器会自动生成上图中的请求。在浏览器不支持FormData
的情况下,我们可以通过拼接multipart/form-data
请求,来达到目的。
动手实现了一个:https://github.com/henryluki/...
参考
FormData
The Multipart Content-Type
XMLHttpRequest Standard
Returning Values from Forms: multipart/form-data
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。