XMLHttpRequest Level 2添加了一個新的接口FormData。利用FormData對象,咱們能夠經過js用一些鍵值對來模擬一系列表單控件,咱們還可使用XMLHttpRequest的send()方法來異步的提交這個"表單"。比起普通的ajax,使用FormData的最大優勢就是咱們能夠異步上傳一個二進制文件(圖片、壓縮文件等)。html
html<form id="form1" enctype="multipart/form-data" method="post" action="/session/sendImg?subID=3&subsID=2&ssID=163"> <input type="file" name="file" id="file"/> <input type="text" name="name" id="name"/> <input type="button" onclick="sendForm()" value="Upload" /> </form>
jsfunction sendForm(){ var fr = document.getElementById("form1") var fd = new FormData(fr);//使用HTML表單來初始化一個FormData對象 fd.append("file", document.getElementById('file').files[0]); var xhr = new window.XMLHttpRequest(); xhr.upload.addEventListener("progress", uploadProgress, false); xhr.addEventListener("load", uploadComplete, false); xhr.addEventListener("error", uploadFailed, false); xhr.addEventListener("abort", uploadCanceled, false); console.log(fd) xhr.open("POST", "/session/sendImg?subID=3&subsID=2&ssID=163"); xhr.send(fd); } //+ uploadComplete 上傳結束函數 //+ uploadFailed 上傳錯誤函數 //+ uploadCanceled 終止函數
使用JSLite來發送FormData,但必需要正確的設置相關選項(jQuery是同樣的玩兒)ajax
jsfunction sendForm(){ var fd = new FormData(); fd.append("file",$('#file')[0].files[0]); fd.append("name",$('#name').val()); $.ajax({ type:'POST', dataType:'text', processData: false, // 告訴JSLite不要去處理髮送的數據 contentType: false, // 告訴JSLite不要去設置Content-Type請求頭 data:fd, url:'/session/sendImg?subID=3&subsID=2&ssID=163', success:function(data){ console.log('success:',data) }, error:function(d){ console.log('error:',d) } }) }
給當前FormData對象添加一個鍵/值對
void append(DOMString name, Blob value, optional DOMString filename);
void append(DOMString name, DOMString value);
MDN 參考地址瀏覽器
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 7+ | 4.0 (2.0) | 10+ | 12+ | 5+ |
支持filename參數 (Yes) | 22.0 | (22.0) | ? | ? | ? |