vue項目中form data形式傳參方式
vue中form data形式傳參
vue項目中form data形式傳參,需要在headers中添加如下代碼
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
接口請求如下:
export function subFaq (params) { return request({ url: `/jxxx/pub/iface/speech/`, method: 'PUT', data:qs.stringify(params), headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }) }
如下圖,在Form Data的中形式下,需要使用qs.stringify(params) ,params是一個對象
如下圖,在Form Data的中形式下,直接傳的是對象
vue文件提交 FormData方式
做Vue項目的時候, 提交數據基本上都是用Axios, 之前做過的表單方面的提交,一直沒有空隙進行總結,今天得空進行一下復習和總結:Vue中使用Axios處理包含上傳文件的表單提交
可能出現的問題:
常見的問題 |
---|
1、上傳文件應該以什麼方式提交, 比如後臺是multipart/form-data, 而習慣性以json對象發送數據(實際上大量插件對數據對象也封裝瞭方法, 所以容易忽略) |
2、上傳文件提交的格式, 以為將對象改成數組就太天真瞭 |
3、語法錯誤. 比如:>> :on-change=“自定義事件名” 寫成>> @on-change="" |
前驅知識
FormDate
FormData 接口提供瞭一種表示表單數據的鍵值對 key/value 的構造方式,並且可以輕松的將數據通過XMLHttpRequest.send() 方法發送出去,本接口和此方法都相當簡單直接。如果送出時的編碼類型被設為 “multipart/form-data”,它會使用和表單一樣的格式。
每個FormData對象都有一個相關的entry。它最初是一個空列表。entry 由name和value組成。
英文文獻:https://xhr.spec.whatwg.org/#interface-formdata
FormData()
使用的時候要創建一個新的 FormData 對象。
let FormData = new FormData();
方法
FormData.append(name, value)`
向 FormData 對象中添加新的屬性值,FormData 對應的屬性值存在也不會覆蓋原值,而是新增一個值,如果屬性不存在則新增一項屬性值。
append(name, value) 和 append(name, blobValue, filename)
請註意參數name、value和blobValue存在的原因是由於用於編寫的編輯軟件的限制XMLHttpRequest標準。
FormData.delete(name)
delete (name)
方法步驟是從這個條目列表中刪除名稱為name的所有條目。FormData.entries()
返回一個包含所有鍵值對的iterator對象。FormData.get(name)
返回在 FormData 對象中與給定鍵關聯的第一個值。
如果在這個條目列表中沒有名稱為name的條目,則返回null。
返回此條目列表中名稱為name的第一個條目的值。
FormData.getAll(name)
返回一個包含 FormData 對象中與給定鍵關聯的所有值的數組。
如果在這個條目列表中沒有名稱為name的條目,則返回空列表
按順序從這個條目列表中返回名稱為name的所有條目的值
FormData.has(name)
返回一個佈爾值表明 FormData 對象是否包含某些鍵。
如果在條目列表中有一個名為name的條目,則has (name)方法步驟將返回true;否則false。
FormData.keys()
返回一個包含所有鍵的iterator對象。FormData.set(name, value)
給 FormData 設置屬性值,如果FormData 對應的屬性值存在則覆蓋原值,否則新增一項屬性值。
set (name, value)和set (name, blobValue, filename)方法步驟如下:
1.給予的value要有value值;否則blobValue。
2.如果使用name、blobValue和filename,則將entry設為創建條目的結果。
3.如果在這個條目列表中有名稱為name的條目,那麼用entry替換第一個這樣的條目,並刪除其他條目
4.否則,將條目添加到this的條目列表中。
FormData.values()
返回一個包含所有值的iterator對象。
FormData的使用
axios 傳參時要註意的
//重點在* //重點在* //重點在* //重點在* let file = new FormData();//* for(let key in data){//* file.append(key,data[key]);//* }; axios({ method:"post", url:baseUrl +"/api/cateadd", data:file,//* }).then(res=>{ //請求成功返回的數據在這進行操作 }).catch(err=>{ //請求失敗返回的數據在這 });
URL
URL.createObjectURL(file)
通過URL.createObjectURL(file)可以獲取當前文件的一個內存URL,
createObjectURL是同步執行的
createObjectURL返回一段帶hash的url,並且一直存儲在內存中,直到document觸發瞭unload事件(例如:document close)或者執行revokeObjectURL來釋放。
實操
下面使用兩種方式進行講解文件如何提交:
1.使用element-ui
使用element-ui的方便之處就是不用再費勁自己寫css樣式,有包裝好的組件直接引入即可,在這不講怎麼使用element-UI的使用,感興趣的自己進官網進行查看(官網:https://element.faas.ele.me/#/zh-CN)
使用 element-ui 中的 Upload 組件,
代碼引入以後查看upload組件對應的方法屬性,裡面有兩個方法:on-success和on-change兩個鉤子函數,
鉤子函數 | 說明 | 類型 |
---|---|---|
on-success | 文件上傳成功時的鉤子 | function(response, file, fileList)response是服務器返回的響應file一個文件fileList存放多個文件的數組 |
on-change | 文件狀態改變時的鉤子,添加文件、上傳成功和上傳失敗時都會被調用 | function(file, fileList)file一個文件fileList存放多個文件的數組 |
element-UI將返回的file對象封裝瞭一下, 首先我們要拿到真正的文件對象, 使用的時候一定要在提交數據之前看看數據到底在哪裡:
- 真正的File對象是fileList數組中某個元素的raw屬性!
- 真正的File對象是fileList數組中某個元素的raw屬性!
- 真正的File對象是fileList數組中某個元素的raw屬性!
- 真正的File對象是fileList數組中某個元素的raw屬性!
重要的事多說幾遍!!!!
在這我選擇使用on-change,因為element-UI中提供瞭一個http-request事件來覆蓋默認的action, 這樣很好的避免瞭一些異常,on-success雖然通過瞭驗證, 但是在生產環境中由於action地址空所以默認請求當前地址, 出現瞭404。
<template> <el-upload class="avatar-uploader" action="#" :show-file-list="false" :on-change="changeImg"// changeImg事件名是自定義的 > <img v-if="imageUrl" :src="imageUrl" class="avatar" > <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </template>
<script> //改變圖片時,獲取圖片路徑及信息,e 指的是提交上來的文件 changeImg(e){ // 1.處理文件大小 if(e.size > 2*1024*1024){ alert('文件大小不能超過2M') return } // 2.處理文件後綴 var ext = ['.jpg','.png','.jpeg','.gif']; var extName = e.name.slice(e.name.lastIndexOf('.')); if(!ext.some(item=>item==extName)){ alert('上傳文件格式不正確') return } // 上傳顯示的文件 // 將文件生成url地址,並顯示在頁面中 this.imageUrl = URL.createObjectURL(e.raw) // 將文件存放到form.img中 this.form.img = e.raw;//真正的File對象是fileList數組中某個元素的raw屬性! }, </script>
2.使用原始的方法
自己寫好樣式:
<template> <!-- 自定義文件上傳 --> <div class="img-box"> <h3>+</h3> <img v-if="imageUrl" :src="imageUrl" alt=""> <input type="file" @change="changeImg1"> </div> </template>
<script> changeImg1(e){ // 取出上傳的文件 let file = e.target.files[0]; // 1.確認文件大小 if (file.size > 2 * 1024 * 1024) { warningAlert("文件大小不能大於2M"); return; } // 2.確認文件格式 let arr = [".jpg", ".jpng", ".png", ".jpeg"]; let lastName = file.name.slice(file.name.lastIndexOf(".")); if (!arr.some(item => item == lastName)) { warningAlert("文件格式錯誤"); return; } // 3.獲取文件的存儲位置用於渲染頁面 this.imgUrl = URL.createObjectURL(file); // console.log(this.imgUrl); // 4.將文件賦值給要提交的變量 this.form.img = file; }, </script>
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Vue使用axios圖片上傳遇到的問題
- vue上傳文件formData上傳的解決全流程
- elementUI自定義上傳文件功能實現(前端後端超詳細過程)
- 解析element-ui中upload組件傳遞文件及其他參數的問題
- 解決el-upload批量上傳隻執行一次成功回調on-success的問題