你能够建立一个你本身的FormData对象,而后经过append() 方法向对象中添加键值对,就像下面这样:javascript
var formData = new FormData();php
formData.append("username", "Groucho");
formData.append("accountnum", 123456); // number 123456 is immediately converted to a string "123456"java
// HTML file input, chosen by user
formData.append("userfile", fileInputElement.files[0]);web
// 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"});ajax
formData.append("webmasterfile", blob);服务器
var request = new XMLHttpRequest();
request.open("POST", "http://foo.com/submitform.php");
request.send(formData);
--------------------- app
注意:字段”userfile” 和 “webmasterfile” 都包含文件(file)。被分配到字段”accountnum”上的数字直接被FormData.append()方法转换成了字符串(字段的值(value)多是一个Blob, File, 或一个string:若是值既不是Blob也不是File,则值会被转换成一个string)。
--------------------- 函数
这个例子建立了一个FormData实例,其中包含字段”username”, “accountnum”, “userfile” 和 “webmasterfile”,而后使用XMLHttpRequest对象的send()方法去发送表单数据。字段”webmasterfile”是一个Blob。一个Blob对象表明一个文件对象的原始数据。可是Blob表明的数据没必要须是javascript原生格式的数据。文件接口是基于Blob,继承Blob功能和扩大它对用户文件系统的支持。为了构建一个Blob能够调用Blob()构造函数。post
2、从一个HTML表单得到一个FormData对象
为了得到一个包含已存在表单数据的FormData对象,在建立FormData对象的时候须要指定表单元素。
---------------------
var formData = new FormData(someFormElement);ui
就像下面这样:
var formElement = document.querySelector("form");
var request = new XMLHttpRequest();
request.open("POST", "submitform.php");
request.send(new FormData(formElement));
---------------------
你也能够在得到FormData对象以后增长另外的数据,就像下面这样:
var formElement = document.querySelector("form");
var formData = new FormData(formElement);
var request = new XMLHttpRequest();
request.open("POST", "submitform.php");
formData.append("serialnumber", serialNumber++);
request.send(formData);
---------------------
你可使用FormData发送文件。简单的<form>中在包含一个<input>元素就能够:
<form enctype="multipart/form-data" method="post" name="fileinfo">
<label>Your email address:</label>
<input type="email" autocomplete="on" autofocus name="userid" placeholder="email" required size="32" maxlength="64" /><br />
<label>Custom file label:</label>
<input type="text" name="filelabel" size="12" maxlength="32" /><br />
<label>File to stash:</label>
<input type="file" name="file" required />
<input type="submit" value="Stash the file!" />
</form>
<div></div>
---------------------
而后你可使用下面的代码去发送:
var form = document.forms.namedItem("fileinfo");
form.addEventListener('submit', function(ev) {
var oOutput = document.querySelector("div"),
oData = new FormData(form);
oData.append("CustomField", "This is some extra data");
var oReq = new XMLHttpRequest();
oReq.open("POST", "stash.php", true);
oReq.onload = function(oEvent) {
if (oReq.status == 200) {
oOutput.innerHTML = "Uploaded!";
} else {
oOutput.innerHTML = "Error " + oReq.status + " occurred when trying to upload your file.<br \/>";
}
};
oReq.send(oData);
ev.preventDefault();
}, false);
---------------------
你也能够直接向FormData对象中添加File或Blob,就像下面这样:
data.append("myfile", myBlob, "filename.txt");
当使用append() 方法的时候,可能会使用到第三个参数去发送文件名称(经过Content-Disposition头发送到服务器)。若是没有指定第三个参数或这个参数不被支持的话,第三个参数默认是”blob”。
若是你设置好正确的options,你也能够和jQuery配合起来使用:
var fd = new FormData(document.querySelector("form"));fd.append("CustomField", "This is some extra data");$.ajax({ url: "stash.php", type: "POST", data: fd, processData: false, // tell jQuery not to process the data contentType: false // tell jQuery not to set contentType});