您好,登錄后才能下訂單哦!
這篇文章主要詳解Vue如何實現附件上傳功能,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
前言
前端 UI 是用的是 element-ui 的上傳功能
本文主要記錄下代碼,方便下次復制粘貼
前端部分
HTML
<el-upload ref="upload" :limit="1" :on-remove="handleRemove" :on-error="onError" :file-list="fileList" :auto-upload="false" :http-request="uploadFile" action="https://jsonplaceholder.typicode.com/posts/" class="upload-demo"> <el-button slot="trigger" size="small" type="primary">選取文件</el-button> <!-- <el-button size="small" type="success" @click="submitUpload">上傳到服務器</el-button> --> <div slot="tip" class="el-upload__tip">支持上傳 {{ strRebuild(fileType) }} 格式,且不超過 {{ fileSize }}M</div> </el-upload>
JS
import { strRebuild, lastSubstring } from '@/utils/strUtil' import { message } from '@/utils/message' export default { data() { return { // 附件列表 fileList: [], // 允許的文件類型 fileType: ['xls', 'xlsx', 'pdf', 'doc', 'docx', 'txt', 'jpg', 'png', 'jpeg'], // 運行上傳文件大小,單位 M fileSize: 10, } }, methods: { // 清空表單 clear() { // 清空附件 this.$refs.upload.clearFiles() }, // 附件檢查 // 檢查附件是否屬于可上傳類型 // 檢查附件是否超過限制大小 checkFile() { var flag = true var tip = '' var files = this.$refs.upload.uploadFiles files.forEach(item => { // 文件過大 if (item.size > this.fileSize * 1024 * 1024) { flag = false tip = ' 文件超過' + this.fileSize + 'M' } // 文件類型不屬于可上傳的類型 if (!this.fileType.includes(lastSubstring(item.name, '.'))) { flag = false tip = ' 文件類型不可上傳' } }) if (!flag) { message('error', tip) } return flag }, // 提交附件 submitUpload() { if (this.checkFile()) { console.log('上傳附件...') this.$refs.upload.submit() } else { console.log('取消上傳') } }, // 自定義文件上傳方法 uploadFile(file) { // 把文件放入 FormData 進行提交 const param = new FormData() param.append('files', file.file) uploadFile(param).then(response => { // TODO 一些關閉彈框,上傳成功提示等 }) }, // 移除附件 handleRemove(file, fileList) { console.log('移除附件...') }, // 附件上傳失敗,打印下失敗原因 onError(err) { message('error', '附件上傳失敗') console.log(err) }, // 字符串重組 strRebuild(str) { return strRebuild(str) } } }
工具類 JS
strUtil.js
// 字符串相關工具類 // 數組根據分隔符重組為字符串 export function strRebuild(arr, split) { if (arr === undefined || arr === null || !(arr instanceof Array) || arr.length === 0) { return '' } if (split === undefined || split === null) { split = ',' } var str = '' arr.forEach((v, i) => { if (i === arr.length - 1) { str = str + v } else { str = str + v + split } }) return str } // 截取最后一個特定字符后面的字符串 export function lastSubstring(str, split) { if (str === undefined || str === null || split === undefined || split === null) { return '' } return str.substring(str.lastIndexOf(split) + 1) }
message.js
import { Message } from 'element-ui' // 提示封裝 type 提示類型, msg 提示信息,duration 持續時間 export function message(type, msg, duration) { Message({ message: msg || 'success', type: type || 'success', duration: duration || 5 * 1000 }) } // 帶刪除鍵提示,duration 為 0 時,不會自動消失 // 提示封裝 type 提示類型, msg 提示信息,duration 持續時間 export function messageShowClose(type, msg, duration) { Message({ message: msg || 'success', type: type || 'success', duration: duration || 0, showClose: true }) }
API
// 附件上傳 export function uploadFile(file) { return request({ url: '/uploadFile', method: 'post', headers: { 'Content-Type': 'multipart/form-data; charset=utf-8' }, data: file }) }
后端接口
/** * 單文件上傳 * @param files 接收文件要以數組接收 * @return */ @PostMapping(value="/uploadFile") public void uploadFile(@RequestBody MultipartFile[] files) { // TODO }
以上就是關于詳解Vue如何實現附件上傳功能的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。