vue如何使用formData傳遞文件類型的數(shù)據(jù)
vue使用formData傳遞文件類型的數(shù)據(jù)
1.需求
傳遞文件類型的數(shù)據(jù)和其他類型的數(shù)據(jù)到后臺。組件使用的是element-ui,就想去里面直接找組件使用,看到了el-upload,就試著用了一下,發(fā)送的是ajax請求,發(fā)現(xiàn)后臺接收不到就開始找問題了。
2.問題
看了一下發(fā)送請求攜帶file文件協(xié)議有兩種方法,鏈接(FormData 對象的使用 - Web API 接口參考 | MDN),form表單提交,另外一種是formData(h5里面的新方法),都很方便。因?yàn)槲矣玫氖莢ue,就用formData的格式進(jìn)行傳輸。照著網(wǎng)站開始改吧~~
3.操作
- 3.1 網(wǎng)頁文件
<el-dialog title="導(dǎo)出指定體檢信息" :visible.sync="dialogVisibleexptbyfile" width="50%" center :append-to-body="true"> ? ? ? <div class="submit"> ? ? ? ? <el-form :model="form" label-width="130px" label-position="left"> ? ? ? ? ? <el-form-item label="xxx"> ? ? ? ? ? ? <el-select v-model="form.type" placeholder="請選擇類型"> ? ? ? ? ? ? ? <el-option label="xxx" value="0"></el-option> ? ? ? ? ? ? ? <el-option label="xxx" value="1"></el-option> ? ? ? ? ? ? </el-select> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="選擇文件"> ? ? ? ? ? ? <el-upload class="upload-demo" :limit="1" :on-exceed="exceedfile" :headers="{headers: 'multipart/form-data'}" action="#" :on-change="onChangefile" :before-upload="beforeuploadfile" :auto-upload='false' :file-list="fileList"> ? ? ? ? ? ? ? <el-button size="small" type="primary">點(diǎn)擊上傳</el-button> ? ? ? ? ? ? </el-upload> ? ? ? ? ? ? <!-- <input type="file" id="file" ref="file" @change="selectFile"> --> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="xxxxxx"> ? ? ? ? ? ? <el-input v-model="form.sheetIndex" style="width: 52%;"></el-input> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="xxx"> ? ? ? ? ? ? <el-input v-model="form.startRow" style="width: 52%;"></el-input> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="xxxx"> ? ? ? ? ? ? <el-input v-model="form.colNum" style="width: 52%;"></el-input> ? ? ? ? ? </el-form-item> ? ? ? ? </el-form>? ? ? ? </div> ? ? ? <span slot="footer" class="dialog-footer"> ? ? ? ? <el-button @click="dialogVisibleexptbyfile = false">取 消</el-button> ? ? ? ? <el-button type="primary" @click="exptbyfile">確 定 導(dǎo) 出</el-button> ? ? ? </span> </el-dialog> data () { ? ? return { ? ? ? // 彈框顯示和隱藏 ? ? ? dialogVisibleexptbyfile: false, ? ? ? form: { ? ? ? ? type: '', ? ? ? ? sheetIndex: '1', ? ? ? ? colNum: '1', ? ? ? ? startRow: '1' ? ? ? }, ? ? ? fileList: [], ? ? ? file: null ? ? }; }
- 3.2 點(diǎn)擊提交的方法
看了element-ui上的解釋,添加請求頭 :headers="{headers: 'multipart/form-data'}",上傳前的方法,:before-upload="beforeuploadfile",關(guān)閉自動上傳的方法:auto-upload='false'。
?<el-upload class="upload-demo" :limit="1" :on-exceed="exceedfile" :headers="{headers: 'multipart/form-data'}" action="#" :on-change="onChangefile" :before-upload="beforeuploadfile" :auto-upload='false' :file-list="fileList"> ? ? ?<el-button size="small" type="primary">點(diǎn)擊上傳</el-button> ?</el-upload>? ? ? ??
- 3.3 寫方法
import {Utils} from 'xxxxxxxx' methods: { ? ? ?onChangefile (file) { ? ? ? // file文件改變 ? ? ? var testmsg = file.name.substring(file.name.lastIndexOf('.') + 1) ? ? ? //這里我需要上傳表格文件,所以做了限制 ? ? ? if (['xls', 'xlsx'].indexOf(testmsg.toLowerCase()) == -1) { ? ? ? ? this.$message.warning('只能上傳.XLS.XLSX格式的文件!') ? ? ? ? this.fileList.shift() ? ? ? ? return ? ? ? } ? ? ? //將選取的文件拿到,這里需要根據(jù)自己業(yè)務(wù)來寫 ? ? ? this.fileList[0] = file ? ? ? this.file = file.raw ? ? ? this.filename = file.name ? ? }, ? ? // 只允許上傳一個文件 ? ? exceedfile () { ? ? ? this.$message.warning('只能上傳一個文件,請刪除后添加!') ? ? }, ? ? beforeuploadfile (file) { ? ? ? // console.log("beforeupload", file) ? ? ? this.file = file ? ? }, ? ? // 指定下載文件? ? ? exptbyfile () { ? ? ? if (this.fileList.length == 0) { ? ? ? ? this.$message.warning('請上傳文件'); ? ? ? ? return ? ? ? } ? ? ? if (this.form.type == "") { ? ? ? ? this.$message.warning('請選擇類型'); ? ? ? ? return ? ? ? }? ? ? ? const formData = new FormData() //FormData對象,添加參數(shù)只能通過append('key', value)的形式添加 ? ? ? formData.append('file', this.file) //添加文件對象 ,data中設(shè)置的 ? ? ? //調(diào)用上傳接口 ? ? ? let userinfo = User.getData("userInfo"); ? ? ? var params = { ? ? ? ? // 一些參數(shù) XXXXX ? ? ? ? type: this.form.type ? ? ? }; ? ? ? // console.log(this.file); ? ? ? ?// 直接掉用方法即可 ? ? ? Utils.upload(this.file, "xxxxxxx", params) ? ? }, }? ? ? ?
4.Utils的方法重點(diǎn)是添加processData: false, contentType: false
如果沒有jquery就下一個引入就可以了。
function upload (res, url, params = {}) { ? return new Promise((resolve) => { ? ? var formData = new FormData();? ? ? formData.append("file", res); ? ? for (var i in params) { ? ? ? formData.append(i, params[i]); ? ? }? ? ? $.ajax({ ? ? ? url: baseURl + url, ? ? ? type: "POST", ? ? ? data: formData, ? ? ? cache: false, //上傳文件無需緩存? ? ? ? processData: false, //用于對data參數(shù)進(jìn)行序列化處理 這里必須false ~~~~~~重點(diǎn)一定要寫 ? ? ? contentType: false, //必須*/ // ~~~~~~重點(diǎn)一定要寫? ? ? ? success: function (data) { ? ? ? ?console.log(data) ? ? ? ? if (data.code == 0) { ? ? ? ? ? resolve(data.data); ? ? ? ? } else { ? ? ? ? ? showTis("上傳錯誤,請聯(lián)系管理員", 'error') ? ? ? ? } ? ? ? }, ? ? }); ? }) } export default { ? ? upload }
這樣后臺就可以接受到數(shù)據(jù)了。
注意:
1.利用Formdata對數(shù)據(jù)進(jìn)行操作。
2.jquery需要添加兩個參數(shù)設(shè)置。
vue使用formData時候傳遞參數(shù)是個空值的情況
關(guān)于在vue中使用axios,傳遞的參數(shù)是formData的情況(上傳文件,圖片,文檔等)
formData用途
1.將from表單元素的name和value結(jié)合,實(shí)現(xiàn)表單數(shù)據(jù)的序列化
2.異步上傳文件
使用formData
1.創(chuàng)建一個空對象
var formData = new FormData(); //大部分情況下,使用formData追加數(shù)據(jù),是通過append() Api來進(jìn)行追加 formData.append(key,value) //取出追加的值 formData.get(key) //修改值 formData.set(key,newVale)
2.通過表單對formData進(jìn)行初始化
<form id="myForm"> ? ? <p>name:<input type="text" name="name" ?value="xiaolong"></p> ? ??? ?<p>age:<input type="text" name="age" ?value="23"></p> ? ? <p><input type="button" id="btn" value="添加"></p> </form>
通過表單元素作為參數(shù),對formData進(jìn)行初始化
var btn=document.querySelector("#btn"); btn.onclick=function(){ ? ? //獲取表單元素 ? ? var form=document.querySelector("#myForm"); ? ? //初始化表單 ? ? var formdata=new FormData(form); ?? ?//此時可以進(jìn)行一個操作,獲取或者設(shè)置表單的值或者直接提交整個表單 ? ? console.log(formdata.get("name"));//xiaolong }
具體表單的操作API
大部分可以從mdn上面查找到
舉個例子:
獲取表單數(shù)據(jù)或者獲取整個表單對應(yīng)key的數(shù)據(jù)
formData.get('age')//獲取一個key為age的值 formData.getAll('age')//獲取全部key為age的數(shù)據(jù)
在vue里面使用formData的時候,因?yàn)閍xios是進(jìn)行了二次封裝,所以傳遞表達(dá)的時候會傳遞一個空表單過去,這是因?yàn)閍xios在進(jìn)行二次封裝的時候回影響到原來的表單提交或者文件上傳
因此在使用二次封裝axios的時候需要進(jìn)行一個參數(shù)的設(shè)置
this.$axios({ ? ? method: "post", ? ? url: `你的請求地址`, ? ? data: formD,//這個是我的fromdata ? ? headers: { ? ? transformRequest: [data => data]//此處是我進(jìn)行設(shè)置的轉(zhuǎn)換數(shù)據(jù)類型 ? ? } })
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue指令?v-bind的使用和注意需要注意的點(diǎn)
這篇文章主要給大家分享了?v-bind的使用和注意需要注意的點(diǎn),下面文章圍繞?v-bind指令的相關(guān)資料展開內(nèi)容且附上詳細(xì)代碼?需要的小伙伴可以參考一下,希望對大家有所幫助2021-11-11vue之帶參數(shù)跳轉(zhuǎn)打開新頁面、新窗口
這篇文章主要介紹了vue之帶參數(shù)跳轉(zhuǎn)打開新頁面、新窗口方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04基于vue-seamless-scroll實(shí)現(xiàn)無縫滾動效果
這篇文章主要為大家詳細(xì)介紹了基于vue-seamless-scroll實(shí)現(xiàn)無縫滾動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Vue 大文件上傳和斷點(diǎn)續(xù)傳的實(shí)現(xiàn)
文件上傳在很多項(xiàng)目中都用的到,如果是幾M的很快就傳送完畢,如果是大文件呢?本文就介紹了Vue 大文件上傳和斷點(diǎn)續(xù)傳的實(shí)現(xiàn),感興趣的可以了解一下2021-06-06尤雨溪開發(fā)vue?dev?server理解vite原理
這篇文章主要為大家介紹了尤雨溪開發(fā)的玩具vite,vue-dev-server來理解vite原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07