詳解Vue ElementUI手動(dòng)上傳excel文件到服務(wù)器
概述
具體需求場(chǎng)景如下:

選擇excel文件后,需要把導(dǎo)入的excel文件手動(dòng)上傳到后臺(tái)服務(wù)器,并將導(dǎo)入成功后的統(tǒng)計(jì)結(jié)果顯示出來(lái)。官網(wǎng)也有手動(dòng)上傳的示例,通過(guò) action="url" 傳入地址的方式,但在實(shí)際項(xiàng)目中請(qǐng)求需要自己配置,下面具體說(shuō)明實(shí)現(xiàn)的方法。
說(shuō)明:
在上傳文件到展示統(tǒng)計(jì)結(jié)果,我們后端給了兩個(gè)接口:首先調(diào)用文件上傳接口,上傳成功后,根據(jù)后端返回的mark再調(diào)用統(tǒng)計(jì)結(jié)果接口。
屬性設(shè)置
.vue文件
<el-row>
<div class="el-form-item__content">
<el-upload ref="upload"
accept=".xls,.xlsx"
action="#"
:auto-upload="false"
:multiple="false"
:file-list="fileList"
:before-upload="beforeUpload"
:http-request="uploadHttpRequest"
:on-remove="fileRemove"
:on-change="fileChange">
<el-button size="small" type="primary">選擇文件</el-button>
<div slot="tip" class="el-upload__tip">一次只能上傳一個(gè)xls/xlsx文件,且不超過(guò)10M</div>
</el-upload>
</div>
</el-row>
<el-row>
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button type="primary" size="small" @click="submitUpload">上 傳</el-button>
<el-button type="primary" size="small" @click="downloadRes">下載反饋結(jié)果</el-button>
</el-row>
其中:
- action:上傳的地址,可以不用過(guò)多關(guān)注,但也不建議刪除,可用普通字符串代替
- auto-upload:是否自動(dòng)上傳,因這里是手動(dòng)上傳,所以設(shè)置為false
- multiple:是否支持多選,此處設(shè)置為 false
- file-list:上傳的文件列表數(shù)組
- before-upload:上傳文件之前的鉤子,參數(shù)為上傳的文件,可以在這里判斷上傳文件的類型,文件大小等
- http-request:自定義上傳的方法,會(huì)覆蓋默認(rèn)的上傳行為(即action="url")
- on-remove:上傳文件移除時(shí)觸發(fā)的方法
- on-change:上傳文件狀態(tài)(添加,上傳成功或失?。└淖儠r(shí)觸發(fā)的方法
處理邏輯
邏輯處理代碼如下:
methods: {
// 上傳文件之前的鉤子:判斷上傳文件格式、大小等,若返回false則停止上傳
beforeUpload(file) {
//文件類型
const isType = file.type === 'application/vnd.ms-excel'
const isTypeComputer = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
const fileType = isType || isTypeComputer
if(!fileType) {
this.$message.error('上傳文件只能是xls/xlsx格式!')
}
// 文件大小限制為10M
const fileLimit = file.size / 1024 / 1024 < 10;
if(!fileLimit) {
this.$message.error('上傳文件大小不超過(guò)10M!');
}
return fileType && fileLimit
},
// 自定義上傳方法,param是默認(rèn)參數(shù),可以取得file文件信息,具體信息如下圖
uploadHttpRequest(param) {
const formData = new FormData() //FormData對(duì)象,添加參數(shù)只能通過(guò)append('key', value)的形式添加
formData.append('file', param.file) //添加文件對(duì)象
formData.append('uploadType', this.rulesType)
const url = `${this.myBaseURL}/operation/ruleImport/importData` //上傳地址
axios.post(url, formData)
.then( res => {
const { data: { code, mark } } = res
if(code === 0) {
param.onSuccess() // 上傳成功的文件顯示綠色的對(duì)勾
this.uploadMark = mark
}
return this.countData(this.uploadMark) //根據(jù)響應(yīng)的 mark 值調(diào)用統(tǒng)計(jì)結(jié)果接口,返回一個(gè)promise以便進(jìn)行鏈?zhǔn)秸{(diào)用
})
.then( res => { //鏈?zhǔn)秸{(diào)用,統(tǒng)計(jì)結(jié)果的響應(yīng)
const { data: { code, data } } = res
if(code === 0) {
console.log('統(tǒng)計(jì)結(jié)果', data)
}
})
.catch( err => {
console.log('失敗', err)
param.onError() //上傳失敗的文件會(huì)從文件列表中刪除
})
},
// 統(tǒng)計(jì)結(jié)果
countFile(mark) {
return new Promise((resolve, reject) => {
axios
.get(`/operation/ruleImport/countData?mark=${mark}`)
.then(res => {
resolve(res)
})
.catch(error => {
reject(error)
})
})
},
// 點(diǎn)擊上傳:手動(dòng)上傳到服務(wù)器,此時(shí)會(huì)觸發(fā)組件的http-request
submitUpload() {
this.$refs.upload.submit()
},
// 文件發(fā)生改變
fileChange(file, fileList) {
if (fileList.length > 0) {
this.fileList = [fileList[fileList.length - 1]] // 展示最后一次選擇的文件
}
},
// 移除選擇的文件
fileRemove(file, fileList) {
if(fileList.length < 1) {
this.uploadDisabled = true //未選擇文件則禁用上傳按鈕
}
},
// 取消
closeDialog() {
this.$refs.upload.clearFiles() //清除上傳文件對(duì)象
this.fileList = [] //清空選擇的文件列表
this.$emit('close', false)
}
}
http-request 的param參數(shù),打印結(jié)果如圖。通過(guò)param.file取得當(dāng)前文件對(duì)象。

以上就是詳解Vue ElementUI手動(dòng)上傳excel文件到服務(wù)器的詳細(xì)內(nèi)容,更多關(guān)于Vue ElementUI手動(dòng)上傳excel文件到服務(wù)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue2.0項(xiàng)目集成Cesium的實(shí)現(xiàn)方法
這篇文章主要介紹了vue2.0項(xiàng)目集成Cesium的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
vue3 組合式API defineEmits() 與 emits 組
在Vue中,defineEmits()是Vue3組合式API中用于聲明自定義事件的,而emits選項(xiàng)則用于Vue2和Vue3的選項(xiàng)式API中,defineEmits()允許使用字符串?dāng)?shù)組或?qū)ο笮问铰暶魇录?emits選項(xiàng)也支持這兩種形式,且驗(yàn)證函數(shù)可以驗(yàn)證事件參數(shù),這兩種方法都是為了更規(guī)范地在組件間通信2024-09-09
如何使用fetchEventSource實(shí)現(xiàn)sse流式請(qǐng)求
這篇文章主要介紹了如何使用fetchEventSource實(shí)現(xiàn)sse流式請(qǐng)求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Vue 3 中使用 OpenLayers 實(shí)時(shí)顯示 zoom 
本文介紹了如何在 Vue 3 中使用 OpenLayers 來(lái)獲取地圖的 zoom 值以及四角坐標(biāo)信息,并實(shí)時(shí)更新數(shù)據(jù),這種方式可以用于 GIS 應(yīng)用開(kāi)發(fā),幫助用戶更好地了解當(dāng)前地圖范圍,感興趣的朋友一起看看吧2025-04-04
使用VueRouter的addRoutes方法實(shí)現(xiàn)動(dòng)態(tài)添加用戶的權(quán)限路由
這篇文章主要介紹了使用VueRouter的addRoutes方法實(shí)現(xiàn)動(dòng)態(tài)添加用戶的權(quán)限路由,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
淺談一下Vue生命周期中mounted和created的區(qū)別
每一個(gè)vue實(shí)例從創(chuàng)建到銷(xiāo)毀的過(guò)程,就是這個(gè)vue實(shí)例的生命周期,在這個(gè)過(guò)程中,他經(jīng)歷了從開(kāi)始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載Dom、渲染→更新→渲染、卸載等一系列過(guò)程,那么這些過(guò)程中,具體vue做了些啥,我們今天來(lái)了解一下2023-05-05
vue2.0 + element UI 中 el-table 數(shù)據(jù)導(dǎo)出Excel的方法
下面小編就為大家分享一篇vue2.0 + element UI 中 el-table 數(shù)據(jù)導(dǎo)出Excel的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
詳解Vue中如何實(shí)現(xiàn)圖片處理與濾鏡效果
Vue.js作為一個(gè)靈活的JavaScript框架,可以很容易地與圖像處理庫(kù)和濾鏡效果庫(kù)集成,以實(shí)現(xiàn)各種圖像處理需求,下面我們就來(lái)學(xué)習(xí)一下vue是如何實(shí)現(xiàn)圖片處理與濾鏡效果的吧2023-10-10
vue3使用vuedraggable和grid實(shí)現(xiàn)自定義拖拽布局方式
這篇文章主要介紹了vue3使用vuedraggable和grid實(shí)現(xiàn)自定義拖拽布局方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

