https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects
http://www.jianshu.com/p/46e6e03a0d53
通过FormData对象可以组装一组用 XMLHttpRequest
发送请求的键/值对。它可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式和表单通过submit()
方法传输的数据格式相同
如何创建一个FormData对象
你可以自己创建一个FormData对象,然后通过调用它的append()
方法添加字段,就像这样:
1 var formData = new FormData(); 2 3 formData.append("username", "Groucho"); 4 formData.append("accountnum", 123456); // 数字 123456 会被立即转换成字符串 "123456" 5 6 // HTML 文件类型input,由用户选择 7 formData.append("userfile", fileInputElement.files[0]); 8 9 // JavaScript file-like 对象 10 var content = '<a id="a"><b id="b">hey!</b></a>'; // 新文件的正文... 11 var blob = new Blob([content], { type: "text/xml"}); 12 13 formData.append("webmasterfile", blob); 14 15 var request = new XMLHttpRequest(); 16 request.open("POST", "http://foo.com/submitform.php"); 17 request.send(formData);
FormData.append()
方法转换成字符串类型(
FormData
对象的字段类型可以是
Blob
,
File
, 或者 string:
如果它的字段类型不是Blob也不是File,则会被转换成字符串类型。
上面的示例创建了一个FormData
实例,包含"username", "accountnum", "userfile" 和 "webmasterfile"四个字段,然后使用XMLHttpRequest
的send()
方法发送表单数据。字段 "webmasterfile" 是 Blob
类型。一个 Blob对象表示一个不可变的, 原始数据的类似文件对象。Blob表示的数据不一定是一个JavaScript原生格式。 File
接口基于Blob,继承 blob功能并将其扩展为支持用户系统上的文件。你可以通过 Blob()
构造函数创建一个Blob对象。
通过HTML表单创建FormData对象
想要构造一个包含Form表单数据的FormData对象,需要在创建FormData对象时指定表单的元素。
1 var formData = new FormData(someFormElement);
示例:
1 var formElement = document.querySelector("form"); 2 var request = new XMLHttpRequest(); 3 request.open("POST", "submitform.php"); 4 request.send(new FormData(formElement));
还可以在创建一个包含Form表单数据的FormData对象之后和发送请求之前,附加额外的数据到FormData对象里,像这样:
1 var formElement = document.querySelector("form"); 2 var formData = new FormData(formElement); 3 var request = new XMLHttpRequest(); 4 request.open("POST", "submitform.php"); 5 formData.append("serialnumber", serialNumber++); 6 request.send(formData);
这样你就可以在发送请求之前自由地附加不一定是用户编辑的字段到表单数据里
使用FormData对象上传文件
你还可以使用FormData上传文件。使用的时候需要在表单中添加一个文件类型的input:
1 <form enctype="multipart/form-data" method="post" name="fileinfo"> 2 <label>Your email address:</label> 3 <input type="email" autocomplete="on" autofocus name="userid" placeholder="email" required size="32" maxlength="64" /><br /> 4 <label>Custom file label:</label> 5 <input type="text" name="filelabel" size="12" maxlength="32" /><br /> 6 <label>File to stash:</label> 7 <input type="file" name="file" required /> 8 <input type="submit" value="Stash the file!" /> 9 </form> 10 <div></div>
然后使用下面的代码发送请求:
1 var form = document.forms.namedItem("fileinfo"); 2 form.addEventListener('submit', function(ev) { 3 4 var oOutput = document.querySelector("div"), 5 oData = new FormData(form); 6 7 oData.append("CustomField", "This is some extra data"); 8 9 var oReq = new XMLHttpRequest(); 10 oReq.open("POST", "stash.php", true); 11 oReq.onload = function(oEvent) { 12 if (oReq.status == 200) { 13 oOutput.innerHTML = "Uploaded!"; 14 } else { 15 oOutput.innerHTML = "Error " + oReq.status + " occurred when trying to upload your file.<br \/>"; 16 } 17 }; 18 19 oReq.send(oData); 20 ev.preventDefault(); 21 }, false);
注意:如果FormData对象是通过表单创建的,则表单中指定的请求方式会被应用到方法open()中 。
你还可以直接向FormData对象附加File或Blob类型的文件,如下所示:
1 data.append("myfile", myBlob, "filename.txt");
使用appned()方法时,可以通过第三个可选参数设置发送请求的头 Content-Disposition
指定文件名。如果不指定文件名(或者不支持该参数时),将使用名字“blob”。
如果你设置正确的配置项,你也可以通过jQuery来使用FormData对象:
1 var fd = new FormData(document.querySelector("form")); 2 fd.append("CustomField", "This is some extra data"); 3 $.ajax({ 4 url: "stash.php", 5 type: "POST", 6 data: fd, 7 processData: false, // 不处理数据 8 contentType: false // 不设置内容类型 9 });
通过AJAX提交表单和上传文件可以不使用FormData对象
如果你想知道不使用FormData对象的情况下,通过AJAX序列化和提交表单 请点击这里。