vue項(xiàng)目中form?data形式傳參方式
vue中form data形式傳參
vue項(xiàng)目中form data形式傳參,需要在headers中添加如下代碼
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}接口請(qǐng)求如下:
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是一個(gè)對(duì)象

如下圖,在Form Data的中形式下,直接傳的是對(duì)象

vue文件提交 FormData方式
做Vue項(xiàng)目的時(shí)候, 提交數(shù)據(jù)基本上都是用Axios, 之前做過的表單方面的提交,一直沒有空隙進(jìn)行總結(jié),今天得空進(jìn)行一下復(fù)習(xí)和總結(jié):Vue中使用Axios處理包含上傳文件的表單提交
可能出現(xiàn)的問題:
| 常見的問題 |
|---|
| 1、上傳文件應(yīng)該以什么方式提交, 比如后臺(tái)是multipart/form-data, 而習(xí)慣性以json對(duì)象發(fā)送數(shù)據(jù)(實(shí)際上大量插件對(duì)數(shù)據(jù)對(duì)象也封裝了方法, 所以容易忽略) |
| 2、上傳文件提交的格式, 以為將對(duì)象改成數(shù)組就太天真了 |
| 3、語法錯(cuò)誤. 比如:>> :on-change=“自定義事件名” 寫成>> @on-change="" |
前驅(qū)知識(shí)
FormDate
FormData 接口提供了一種表示表單數(shù)據(jù)的鍵值對(duì) key/value 的構(gòu)造方式,并且可以輕松的將數(shù)據(jù)通過XMLHttpRequest.send() 方法發(fā)送出去,本接口和此方法都相當(dāng)簡(jiǎn)單直接。如果送出時(shí)的編碼類型被設(shè)為 “multipart/form-data”,它會(huì)使用和表單一樣的格式。
每個(gè)FormData對(duì)象都有一個(gè)相關(guān)的entry。它最初是一個(gè)空列表。entry 由name和value組成。
英文文獻(xiàn):https://xhr.spec.whatwg.org/#interface-formdata
FormData()使用的時(shí)候要?jiǎng)?chuàng)建一個(gè)新的 FormData 對(duì)象。
let FormData = new FormData();
方法
FormData.append(name, value)`
向 FormData 對(duì)象中添加新的屬性值,F(xiàn)ormData 對(duì)應(yīng)的屬性值存在也不會(huì)覆蓋原值,而是新增一個(gè)值,如果屬性不存在則新增一項(xiàng)屬性值。
append(name, value) 和 append(name, blobValue, filename)
請(qǐng)注意參數(shù)name、value和blobValue存在的原因是由于用于編寫的編輯軟件的限制XMLHttpRequest標(biāo)準(zhǔn)。
FormData.delete(name)
delete (name)方法步驟是從這個(gè)條目列表中刪除名稱為name的所有條目。FormData.entries()返回一個(gè)包含所有鍵值對(duì)的iterator對(duì)象。FormData.get(name)返回在 FormData 對(duì)象中與給定鍵關(guān)聯(lián)的第一個(gè)值。
如果在這個(gè)條目列表中沒有名稱為name的條目,則返回null。
返回此條目列表中名稱為name的第一個(gè)條目的值。
FormData.getAll(name)返回一個(gè)包含 FormData 對(duì)象中與給定鍵關(guān)聯(lián)的所有值的數(shù)組。
如果在這個(gè)條目列表中沒有名稱為name的條目,則返回空列表
按順序從這個(gè)條目列表中返回名稱為name的所有條目的值
FormData.has(name)返回一個(gè)布爾值表明 FormData 對(duì)象是否包含某些鍵。
如果在條目列表中有一個(gè)名為name的條目,則has (name)方法步驟將返回true;否則false。
FormData.keys()返回一個(gè)包含所有鍵的iterator對(duì)象。FormData.set(name, value)給 FormData 設(shè)置屬性值,如果FormData 對(duì)應(yīng)的屬性值存在則覆蓋原值,否則新增一項(xiàng)屬性值。
set (name, value)和set (name, blobValue, filename)方法步驟如下:
1.給予的value要有value值;否則blobValue。
2.如果使用name、blobValue和filename,則將entry設(shè)為創(chuàng)建條目的結(jié)果。
3.如果在這個(gè)條目列表中有名稱為name的條目,那么用entry替換第一個(gè)這樣的條目,并刪除其他條目
4.否則,將條目添加到this的條目列表中。
FormData.values()返回一個(gè)包含所有值的iterator對(duì)象。
FormData的使用
axios 傳參時(shí)要注意的
//重點(diǎn)在*
//重點(diǎn)在*
//重點(diǎn)在*
//重點(diǎn)在*
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=>{
//請(qǐng)求成功返回的數(shù)據(jù)在這進(jìn)行操作
}).catch(err=>{
//請(qǐng)求失敗返回的數(shù)據(jù)在這
});URL
URL.createObjectURL(file)
通過URL.createObjectURL(file)可以獲取當(dāng)前文件的一個(gè)內(nèi)存URL,
createObjectURL是同步執(zhí)行的
createObjectURL返回一段帶hash的url,并且一直存儲(chǔ)在內(nèi)存中,直到document觸發(fā)了unload事件(例如:document close)或者執(zhí)行revokeObjectURL來釋放。
實(shí)操
下面使用兩種方式進(jìn)行講解文件如何提交:
1.使用element-ui
使用element-ui的方便之處就是不用再費(fèi)勁自己寫css樣式,有包裝好的組件直接引入即可,在這不講怎么使用element-UI的使用,感興趣的自己進(jìn)官網(wǎng)進(jìn)行查看(官網(wǎng):https://element.faas.ele.me/#/zh-CN)
使用 element-ui 中的 Upload 組件,

代碼引入以后查看upload組件對(duì)應(yīng)的方法屬性,里面有兩個(gè)方法:on-success和on-change兩個(gè)鉤子函數(shù),
| 鉤子函數(shù) | 說明 | 類型 |
|---|---|---|
| on-success | 文件上傳成功時(shí)的鉤子 | function(response, file, fileList)response是服務(wù)器返回的響應(yīng)file一個(gè)文件fileList存放多個(gè)文件的數(shù)組 |
| on-change | 文件狀態(tài)改變時(shí)的鉤子,添加文件、上傳成功和上傳失敗時(shí)都會(huì)被調(diào)用 | function(file, fileList)file一個(gè)文件fileList存放多個(gè)文件的數(shù)組 |
element-UI將返回的file對(duì)象封裝了一下, 首先我們要拿到真正的文件對(duì)象, 使用的時(shí)候一定要在提交數(shù)據(jù)之前看看數(shù)據(jù)到底在哪里:
- 真正的File對(duì)象是fileList數(shù)組中某個(gè)元素的raw屬性!
- 真正的File對(duì)象是fileList數(shù)組中某個(gè)元素的raw屬性!
- 真正的File對(duì)象是fileList數(shù)組中某個(gè)元素的raw屬性!
- 真正的File對(duì)象是fileList數(shù)組中某個(gè)元素的raw屬性!
重要的事多說幾遍?。。。?/p>
在這我選擇使用on-change,因?yàn)閑lement-UI中提供了一個(gè)http-request事件來覆蓋默認(rèn)的action, 這樣很好的避免了一些異常,on-success雖然通過了驗(yàn)證, 但是在生產(chǎn)環(huán)境中由于action地址空所以默認(rèn)請(qǐng)求當(dāng)前地址, 出現(xiàn)了404。
<template> ? ? <el-upload ? ? ? ? class="avatar-uploader" ? ? ? ? action="#" ? ? ? ? :show-file-list="false" ? ? ? ? :on-change="changeImg"http:// changeImg事件名是自定義的 ? ? ? ? > ? ? ? ? <img v-if="imageUrl" :src="imageUrl" class="avatar" > ? ? ? ? <i v-else class="el-icon-plus avatar-uploader-icon"></i> ? ? </el-upload> </template>
<script>
? ? ? //改變圖片時(shí),獲取圖片路徑及信息,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對(duì)象是fileList數(shù)組中某個(gè)元素的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.確認(rèn)文件大小
? ? ? if (file.size > 2 * 1024 * 1024) {
? ? ? ? warningAlert("文件大小不能大于2M");
? ? ? ? return;
? ? ? }
? ? ? // 2.確認(rèn)文件格式
? ? ? let arr = [".jpg", ".jpng", ".png", ".jpeg"];
? ? ? let lastName = file.name.slice(file.name.lastIndexOf("."));
? ? ? if (!arr.some(item => item == lastName)) {
? ? ? ? warningAlert("文件格式錯(cuò)誤");
? ? ? ? return;
? ? ? }
? ? ? // 3.獲取文件的存儲(chǔ)位置用于渲染頁面
? ? ? this.imgUrl = URL.createObjectURL(file);
? ? ? // console.log(this.imgUrl);
? ? ? // 4.將文件賦值給要提交的變量
? ? ? this.form.img = file;
? ? },
</script>以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決vue js IOS H5focus無法自動(dòng)彈出鍵盤的問題
今天小編就為大家分享一篇解決vue js IOS H5focus無法自動(dòng)彈出鍵盤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
解決element-ui中Popconfirm氣泡確認(rèn)框的事件不生效問題
這篇文章主要介紹了解決element-ui中Popconfirm氣泡確認(rèn)框的事件不生效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
web前端vue之vuex單獨(dú)一文件使用方式實(shí)例詳解
Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。這篇文章主要介紹了web前端vue:vuex單獨(dú)一文件使用方式,需要的朋友可以參考下2018-01-01
Vue中el-menu-item實(shí)現(xiàn)路由跳轉(zhuǎn)的完整步驟
這篇文章主要給大家介紹了關(guān)于Vue中el-menu-item實(shí)現(xiàn)路由跳轉(zhuǎn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-09-09
詳解Vue如何實(shí)現(xiàn)自定義動(dòng)畫與動(dòng)畫效果設(shè)計(jì)
在Vue中,動(dòng)畫效果是非常有用的,它可以使用戶界面變得更加生動(dòng)、有趣,本文中我們將學(xué)習(xí)如何在Vue中進(jìn)行自定義動(dòng)畫與動(dòng)畫效果設(shè)計(jì),感興趣的可以了解一下2023-06-06
Vuejs使用addEventListener的事件如何觸發(fā)執(zhí)行函數(shù)的this
這篇文章主要介紹了Vuejs使用addEventListener的事件觸發(fā)執(zhí)行函數(shù)的this方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Vue.js中動(dòng)態(tài)更改svg的相關(guān)屬性詳解
這篇文章主要為大家介紹了Vue.js中動(dòng)態(tài)更改svg的相關(guān)屬性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
vue+element-ui實(shí)現(xiàn)主題切換功能
這篇文章主要介紹了vue+element-ui實(shí)現(xiàn)主題切換功能,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

