一、概述
FormData對(duì)象的使用:
- 用一些鍵值對(duì)來模擬一系列表單控件:即把form中所有的元素的name與value組成一個(gè)queryString。
- 異步上傳二進(jìn)制文件。
二、使用
-
創(chuàng)建一個(gè)空對(duì)象實(shí)例。
var myform = new FormData(); -
使用已有的表單來初始化
<form id="myForm" action="" method="post"> <input type="text" name="name">名字 <input type="password" name="psw">密碼 <input type="submit" value="提交"> </form>可以使用這個(gè)表單元素作為初始化參數(shù),來實(shí)例化FormData對(duì)象
// 獲取頁(yè)面已有的一個(gè)form表單 var form = document.getElementById("myForm"); //HTML結(jié)構(gòu)沒有表單元素直接忽略這一句 // 用表單來初始化 var formData = new FormData(form); //HTML結(jié)構(gòu)沒有表單元素:var formData = new FormData() // 我們可以根據(jù)name來訪問表單中的字段 var name = formData.get("name"); // 獲取名字 var psw = formData.get("psw"); // 獲取密碼 // 當(dāng)然也可以在此基礎(chǔ)上,添加其他數(shù)據(jù) formData.append("token","kshdfiwi3rh"); -
API操作
3.1、取值
formData.get("name"); // 獲取key為name的第一個(gè)值 formData.getAll("name"); // 返回一個(gè)數(shù)組,獲取key為name的所有值3.2、添加數(shù)據(jù)
? 通過append(key,value)來添加數(shù)據(jù),如果指定的key不存在則會(huì)新增一條數(shù)據(jù),如果key存在,則追加到數(shù)據(jù)末尾
formData.append("k1", "v1"); formData.append("k1", "v2"); formData.append("k1", "v1"); formData.get("k1"); // "v1" formData.getAll("k1"); // ["v1","v2","v1"]3.3、設(shè)置修改數(shù)據(jù)
? 通過set(key,value)來設(shè)置修改的數(shù)據(jù),如果指定的key不存在則會(huì)新增一條,如果存在,則會(huì)修改對(duì)應(yīng)的value值
formData.append("k1", "v1"); formData.set("k1", "1"); formData.getAll("k1"); // ["1"]3.4、判斷是key是否存在
? 通過has(key)判斷key對(duì)應(yīng)的鍵值對(duì)是否存在,存在返回值為true,不存在返回值為false
formData.append("k1", "v1"); formData.append("k2",null); formData.has("k1"); // true formData.has("k2"); // true formData.has("k3"); // false3.5、刪除數(shù)據(jù)
? 通過delete(key)刪除key對(duì)應(yīng)的鍵值對(duì)
formData.append("k1", "v1"); formData.append("k1", "v2"); formData.append("k1", "v1"); formData.delete("k1"); formData.getAll("k1"); // []3.6、遍歷
3.6.1、每調(diào)用一次next()返回一條數(shù)據(jù),數(shù)據(jù)的順序由添加的順序決定
3.6.2、返回的是一個(gè)對(duì)象,當(dāng)其done屬性為true時(shí),說明已經(jīng)遍歷完所有的數(shù)據(jù),這個(gè)也可以作為判斷的依據(jù)
3.6.3、返回的對(duì)象的value屬性以數(shù)組形式存儲(chǔ)了一對(duì)key/value,數(shù)組下標(biāo)0為key,下標(biāo)1為value,如果一個(gè)key值對(duì)應(yīng)多個(gè)value,會(huì)變成多對(duì)key/value返回
formData.append("k1", "v1"); formData.append("k1", "v2"); formData.append("k2", "v1"); var i = formData.entries(); i.next(); // {done:false, value:["k1", "v1"]} i.next(); // {done:fase, value:["k1", "v2"]} i.next(); // {done:fase, value:["k2", "v1"]} i.next(); // {done:true, value:undefined} -
發(fā)送數(shù)據(jù)到后臺(tái)
<!--HTML部分--> <form action=""> <label for=""> 姓名: <input type="text" name="name"> </label> <label for=""> 文件:<input id="file" type="file" name="file"> </label> <label for=""> <input type="button" value="保存"> </label> </form>4.1、原生ajax
//原生js上傳文件 //獲取按鈕 var btn = document.querySelector('[type=button]'); //綁定事件 btn.onclick = function () { //獲取input標(biāo)簽 var file = document.querySelector('[type=file]'); // 新建FormData對(duì)象 var formData = new FormData(); // 取得input標(biāo)簽中的文件。注:input標(biāo)簽中的文件可以選擇多個(gè) formData.append('upload', file.files[0]); //創(chuàng)建XMLHttpRequest,用這個(gè)來發(fā)送數(shù)據(jù) var xhr = new XMLHttpRequest; /*初始化HTTP請(qǐng)求參數(shù)(請(qǐng)求方式,url,是否同步)*/ xhr.open('post', 'file.php'); /* xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 設(shè)置請(qǐng)求頭的contentType */ // 監(jiān)聽上傳進(jìn)度 xhr.upload.onprogress = function (ev) { // 事件對(duì)象 // console.log(ev); var percent = (ev.loaded / ev.total) * 100 + '%'; console.log(percent); progress.style.width = percent; } xhr.send(formData); xhr.onreadystatechange = function () { //status狀態(tài)為200 表示請(qǐng)求成功,readystate為4表示對(duì)象傳遞完畢或者準(zhǔn)備就緒 if(xhr.readyState == 4 && xhr.status == 200) { } } }4.2、jq ajax
//綁定提交事件 function upload() { //獲取form表單元素 var f = document.getElementById("myForm"); //使用表單元素來構(gòu)造FromData var myform = new FormData(f); $.ajax({ url: "/Library/test/upload", type: "post", dataType: "json", data: myform, cache: false, // 不緩存 processData: false, // jQuery不要去處理發(fā)送的數(shù)據(jù) contentType: false, // jQuery不要去設(shè)置Content-Type請(qǐng)求頭 success: function (data) { console.log(data); } }); }4.3、axios
//不需要html板塊方式 //注意:input type="file" 需要通過用戶主觀點(diǎn)擊某塊元素觸發(fā)事件,不可頁(yè)面加載完成調(diào)用,被動(dòng)調(diào)用報(bào)錯(cuò):File chooser dialog can only be shown with a user activation.(翻譯:文件選擇器對(duì)話框只能在用戶激活時(shí)顯示。) function upImg(){ const inp = document.createElement("input"); const _this = this inp.type = "file"; inp.click(); inp.onchange = function(e) { console.log(e.target.files[0]); let params = new FormData(); //創(chuàng)建form對(duì)象 params.append("file", e.target.files[0]); _this.$axios.post("/api/Base/uploadImg", params).then(res => { console.log(res) }).catch(err => { console.log(err); }); } }