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里面的新方法),都很方便。因為我用的是vue,就用formData的格式進行傳輸。照著網(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">點擊上傳</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 點擊提交的方法
看了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">點擊上傳</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的方法重點是添加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ù)進行序列化處理 這里必須false ~~~~~~重點一定要寫
? ? ? contentType: false, //必須*/ // ~~~~~~重點一定要寫?
? ? ? 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ù)進行操作。
2.jquery需要添加兩個參數(shù)設(shè)置。
vue使用formData時候傳遞參數(shù)是個空值的情況
關(guān)于在vue中使用axios,傳遞的參數(shù)是formData的情況(上傳文件,圖片,文檔等)
formData用途
1.將from表單元素的name和value結(jié)合,實現(xiàn)表單數(shù)據(jù)的序列化
2.異步上傳文件
使用formData
1.創(chuàng)建一個空對象
var formData = new FormData(); //大部分情況下,使用formData追加數(shù)據(jù),是通過append() Api來進行追加 formData.append(key,value) //取出追加的值 formData.get(key) //修改值 formData.set(key,newVale)
2.通過表單對formData進行初始化
<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進行初始化
var btn=document.querySelector("#btn");
btn.onclick=function(){
? ? //獲取表單元素
? ? var form=document.querySelector("#myForm");
? ? //初始化表單
? ? var formdata=new FormData(form);
?? ?//此時可以進行一個操作,獲取或者設(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的時候,因為axios是進行了二次封裝,所以傳遞表達的時候會傳遞一個空表單過去,這是因為axios在進行二次封裝的時候回影響到原來的表單提交或者文件上傳
因此在使用二次封裝axios的時候需要進行一個參數(shù)的設(shè)置
this.$axios({
? ? method: "post",
? ? url: `你的請求地址`,
? ? data: formD,//這個是我的fromdata
? ? headers: {
? ? transformRequest: [data => data]//此處是我進行設(shè)置的轉(zhuǎn)換數(shù)據(jù)類型
? ? }
})總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue之帶參數(shù)跳轉(zhuǎn)打開新頁面、新窗口
這篇文章主要介紹了vue之帶參數(shù)跳轉(zhuǎn)打開新頁面、新窗口方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
基于vue-seamless-scroll實現(xiàn)無縫滾動效果
這篇文章主要為大家詳細介紹了基于vue-seamless-scroll實現(xiàn)無縫滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
尤雨溪開發(fā)vue?dev?server理解vite原理
這篇文章主要為大家介紹了尤雨溪開發(fā)的玩具vite,vue-dev-server來理解vite原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07

