vue3+elementui-plus實(shí)現(xiàn)一個(gè)接口上傳多個(gè)文件功能

首先,先使用element-plus寫(xiě)好上傳組件,變量的定義我在這里就省略了都
<el-form-item prop="file" label="附件">
<el-upload
style="width:100%"
class="upload-demo"
drag
ref="upload-demo"
action=""
v-model="taskForm.file"
:file-list="fileLists"
:before-upload="handleBeforeUpload"
:http-request="uploadFile"
:on-remove="handleRemove"
:on-change="handleFileChange"
:limit="3"
:on-exceed="handleExceed"
:headers="headers"
multiple
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">
將文件拖拽到此處,或<em>點(diǎn)擊上傳</em>
</div>
<template #tip>
<div class="el-upload__tip">
最多上傳3個(gè)附件
</div>
</template>
</el-upload>
</el-form-item>然后,綁定的函數(shù)都補(bǔ)充一下
function handleBeforeUpload (file) {
//獲取上傳文件大小
let fileSize = Number(file.size / 1024 / 1024);
if (fileSize > 100) {
ElMessage({ message: '文件大小不能超過(guò)100MB,請(qǐng)重新上傳。', type: 'warning'})
return false
}
}
function uploadFile (params) {
if (params.file == null) {
ElMessage({ message: '請(qǐng)選擇需要上傳的文件', type: 'warning'})
return false
}
}
function handleFileChange (file, fileList) {
fileLists.value = fileList
}
function handleRemove (file, fileList) {
fileLists.value = fileList
}
function handleExceed(files, fileList) {
ElMessage({ message: '最多上傳3個(gè)文件,請(qǐng)刪除后重新上傳!', type: 'warning'})
}然后,假設(shè)有個(gè)提交按鈕,點(diǎn)擊上傳文件請(qǐng)求接口
/** 提交按鈕 */
function submitForm() {
proxy.$refs["taskForms"].validate(valid => {
// 表單其他必填字段校驗(yàn)一下
if (valid) {
// 加個(gè)loading
loading.value = ElLoading.service({
lock: true,
text: 'Loading'
})
// 判斷是否上傳了文件 沒(méi)有就不用調(diào)用上傳
if (fileLists.value.length > 0) {
console.log('list', fileLists.value)
let fileData = new FormData()
var isAdd = false // 區(qū)別是否上傳了新文件
var ids = [] // 編輯時(shí)存儲(chǔ)已經(jīng)回顯的文件ids
// 這里因?yàn)榫庉嫼托略鲞壿嫸加校栽诰庉嫊r(shí)需要區(qū)分,
// 到底是上傳了新文件,還是說(shuō)依舊是原來(lái)的文件,再提交一下表單,提交其他字段而已
// 而判斷是否是最新上傳的文件就依據(jù)是否有文件流raw
for(var i =0 ; i< fileLists.value.length; i++) {
// 通過(guò)是否有文件流raw判斷是否上傳新文件,是則append
if (fileLists.value[i].raw) {
isAdd = true
fileData.append('file', fileLists.value[i].raw)
} else {
// 拿到回顯文件(即非新上傳文件)的id
ids.push(fileLists.value[i].id)
}
}
console.log('ids=', ids)
fileData.append('type', 1) // type代表上傳操作是哪個(gè)模塊的:1任務(wù) 2總結(jié)
// 若isAdd=true,則說(shuō)明添加了新文件,調(diào)用上傳
if (isAdd) {
uploadFileData(fileData).then((res) => {
console.log('upload', res)
if (res.code == 200) {
// 回顯文件id數(shù)組和新上傳文件得到的id數(shù)組合并
taskForm.value.file = ids.concat(res.result.ids)
console.log('file-ids',taskForm.value.file)
addAndEdit() // 調(diào)用保存其他字段信息的接口
}
})
} else {
taskForm.value.file = ids
addAndEdit() // 調(diào)用保存其他字段信息的接口
}
} else {
taskForm.value.file = ''
addAndEdit() // 調(diào)用保存其他字段信息的接口
}
}
})
}既然有編輯,那就應(yīng)該做回顯的邏輯,文件如何回顯到上傳組件上
// 點(diǎn)擊編輯
function editTasks (row) {
let fileData = new FormData()
fileData.append('fileId', row.file)
// 獲取文件名
getFileData(fileData).then((res) => {
console.log('test', res)
if (res.code == 200) {
// 就是這里,拿到文件名,然后文件回顯,我這里是通過(guò)接口拿到文件名,
// 如果你能更直接的拿到文件名,直接執(zhí)行這個(gè)foreach即可
res.result.forEach((item) => {
// 回顯重點(diǎn),就是把你需要的東西push到fileList中
fileLists.value.push({ name: item.fileName, id: item.id })
})
console.log('edoite', taskForm.value, fileLists.value)
}
})
taskId.value = row.id
taskForm.value = {...row}
taskTitle.value = '編輯任務(wù)'
showTask.value = true
taskForm.value.file = row.file !== 'null' ? JSON.parse(row.file) : [] }over 以上主要通過(guò)代碼說(shuō)明,可根據(jù)自己實(shí)際情況改造
到此這篇關(guān)于vue3+elementui-plus實(shí)現(xiàn)一個(gè)接口上傳多個(gè)文件的文章就介紹到這了,更多相關(guān)vue3 elementui-plus上傳多個(gè)文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue中Form 表單的 resetFields() 失效原因及問(wèn)題解決
在Vue項(xiàng)目中,使用formRef.value.resetFields()方法重置表單時(shí)可能遇到不起作用的問(wèn)題,下面就來(lái)介紹一下如何解決,感興趣的可以了解一下2024-09-09
Vue.js使用computed屬性實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新
在Vue組件中,computed屬性是在組件的選項(xiàng)對(duì)象中聲明的,你可以把它們想象成組件的一個(gè)小功能,告訴Vue當(dāng)某些數(shù)據(jù)變化時(shí),如何更新界面,本文給大家介紹了Vue.js使用computed屬性實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新,需要的朋友可以參考下2024-06-06
關(guān)于vue中根據(jù)用戶(hù)權(quán)限動(dòng)態(tài)添加路由的問(wèn)題
每次路由發(fā)生變化時(shí)都需要調(diào)用一次路由守衛(wèi),并且store中的數(shù)據(jù)會(huì)在每次刷新的時(shí)候清空,因此需要判斷store中是否有添加的動(dòng)態(tài)路由,本文給大家分享vue中根據(jù)用戶(hù)權(quán)限動(dòng)態(tài)添加路由的問(wèn)題,感興趣的朋友一起看看吧2021-11-11
解決vue項(xiàng)目Error:Cannot find module‘xxx’類(lèi)報(bào)錯(cuò)問(wèn)題
當(dāng)npm運(yùn)行報(bào)錯(cuò)Error:Cannot find module 'xxx'時(shí),通常是因?yàn)閚ode_modules文件或依賴(lài)未正確安裝,解決步驟包括刪除node_modules和package-lock.json文件,重新運(yùn)行npm install,并根據(jù)需要安裝額外插件,若網(wǎng)絡(luò)問(wèn)題導(dǎo)致安裝失敗2024-10-10
解決Vue.js Devtools未檢測(cè)到Vue實(shí)例的問(wèn)題
在開(kāi)發(fā)Vue.js應(yīng)用時(shí),Vue.js Devtools是一個(gè)不可或缺的調(diào)試工具,然而,有時(shí)我們可能會(huì)遇到“Vue.js not detected”的提示,這意味著Vue.js Devtools未能成功識(shí)別和連接到我們的Vue應(yīng)用,本文將詳細(xì)解析這個(gè)問(wèn)題,并提供相應(yīng)的解決步驟與代碼示例,需要的朋友可以參考下2024-01-01
Vue的路由配置過(guò)程(Vue2和Vue3的路由配置)
這篇文章回顧了Vue2和Vue3中路由的配置步驟,包括安裝正確的路由版本、創(chuàng)建路由實(shí)例、配置routes以及在入口文件中注冊(cè)路由,Vue2中使用Vue.use(VueRouter),而Vue3中使用createRouter和createWebHashHistory2025-01-01
uniapp嵌套webview無(wú)法返回上一級(jí)解決方式
uniapp是一款非常強(qiáng)大的跨平臺(tái)開(kāi)發(fā)框架,它可以讓我們只編寫(xiě)一份代碼,就能在多個(gè)平臺(tái)上運(yùn)行,這篇文章主要給大家介紹了關(guān)于uniapp嵌套webview無(wú)法返回上一級(jí)的解決方式,需要的朋友可以參考下2024-05-05

