FormData的詳細介紹及使用請點擊此處,那里對FormData的方法和事件已經表述的非常清楚,這里就不再浪費時間在介紹一遍了。本文主要針對FormData對象的使用以及異步文件上傳進行詳細的說明。
FormData對象可以讓我們組織一個使用xmlHttPRequest對象發送的鍵值對的集合。它主要用于發送表單數據,但是可以獨立于使用表單傳輸的數據。
你可以創建一個你自己的FormData對象,然后通過append() 方法向對象中添加鍵值對,就像下面這樣:
var formData = new FormData();formData.append("username", "Groucho");formData.append("accountnum", 123456); // number 123456 is immediately converted to a string "123456"http:// HTML file input, chosen by userformData.append("userfile", fileInputElement.files[0]);// javaScript file-like objectvar 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);注意:字段”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()構造函數。
為了獲得一個包含已存在表單數據的FormData對象,在創建FormData對象的時候需要指定表單元素。
var formData = new FormData(someFormElement);就像下面這樣:
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});新聞熱點
疑難解答