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序列化和提交表單 請點擊這里。
