位置: IT常识 - 正文

使用el-upload组件实现递归多文件上传(elementui的upload组件详解)

编辑:rootadmin
使用el-upload组件实现递归多文件上传

推荐整理分享使用el-upload组件实现递归多文件上传(elementui的upload组件详解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:el upload,el-upload action,el-upload的filelist,el-upload属性,el-upload-list,el-upload属性,elementui的upload组件详解,elementui el-upload,内容如对您有帮助,希望把文章链接给更多的朋友!

一、需求描述:在页面上点击按钮弹出选择电脑文件的界面,可以一次性选择多个文件一起上传到服务器上,并把上传成功的文件展示在页面上。

·

二、问题阐述:el-upload是支持多文件上传的,但是是同步进行的,你点击上传按钮,选择了多个文件后点击确定,会同时调用上传文件的接口,这样很容易导致服务器奔溃,导致接口报错。

·

三、解决方法:为了解决这一难题,本文采用递归的方法来实现精准上传文件。

·

使用el-upload组件实现递归多文件上传(elementui的upload组件详解)

四、实现思路:递归上传是指:你选择了n个文件点击确定后,第一个接口上传成功或者失败后,再调用第二个接口上传第二个文件,依次等待上传完所有文件,这样做法可以大大减轻服务器的压力,就是上传时间会比较长。上传效果请看下方动态示例图

 主要逻辑详解:

1、首先需要先取消组件的自动上传操作,把属性auto-upload的值设置为false,就禁用了文件的自动上传功能了,把自动转化为手动,之所以选择多个文件会并行调用上传接口,就是这个属性导致的。

·

2、属性auto-upload设置为false之后,action的属性就失效了,只会触发change事件、上传失败on-error事件以及上传个数限制before-upload事件。

·

3、关键点就在于change事件,选择了多少个文件,这个事件就会执行多少次,例如你选择了100个文件,change事件就会循环执行100次,为了保证上传的准确性,这里顺手写了防抖事件,通过防抖,可以清楚的知道,上传进度到哪了,change事件什么时候结束,在这里就可以开始调用后端给我们的上传接口了。

·

4.因为我是想减少服务器压力,既在上一个文件上传结束后,再去上传下一个文件。故,我采用了递归一次传一个(递归逻辑在submitUpload2事件里)。同样的,如果你想只调用一次接口,将1000个文件传给后端,那么你就将submitUpload2递归事件给修改调,改成调一次接口,传所有file文件数组即可(具体看你们后端的数据结构)。 · 5.因为是上传多个文件,时间肯定长,如果你不想继续传递后续文件,就调用submitAbort即可。但是element文档说的abort()取消上传事件不生效。所以我是直接将上传列表给置空了,所以递归也就结束了就不传递了。. 6.同样因为上传时间长,我就设置了进度条(当前已上传的个数/所有需要上传个数)。但是你如果切换到其他页面的话,再切换到当前上传vue页面,因为生命周期原因导致看不到上传进度。所以可以将这个上传vue页面使用keep-alive进行路由缓存,这样除了刷新浏览器外,切换到当前页还是会读缓存会看到上传进度。(如果你既想要缓存进度条,又想要刷新页面的list等某些数据,那么你缓存此页面,然后在activated单独调获取list数据方法即可)。 . 7.因为我的需要是,选择文件成功后,默认去上传,所以我是在防抖事件后就去调递归上传了。正常情况下,其实需要点击这个按钮然后去上传的,既手动点击上传(被注释掉了)<!-- <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload2">手动点击上传</el-button> -->

以下代码仅供参考,可以直接复制使用(注意将axios的接口转化为后端提供的接口即可)!

<template> <div class="group_insurance_order1" style="padding-top:100px;"> <!-- :auto-upload="false" 是否在选取文件后立即进行上传 false阻止自动上传 -- 且上传前和上传成功的事件都不会再触发 只会触发@change事件了 :http-request="uploadFile" 覆盖默认的上传行为,可以自定义上传的实现(this.$refs.upload1.submit() 会触发调用uploadFile函数) --> <el-upload ref="upload1" class="upload-demo" action="/chc-shop/api/v1/accident/szcp/electronicfile/upload" accept=".pdf" :disabled="disabledUpload" :auto-upload="false" :on-change="changeFile" :on-error='fileErr' :on-exceed="handleExceed" :file-list="fileList1" :before-upload="beforeAvatarUpload" :on-success="msgSuccessOne" :data="fileData" list-type="picture" drag :show-file-list="false" :multiple="true" :limit="1000"> <i class="el-icon-upload"></i> <div class="el-upload__text" style="margin-top: -10px;line-height: 20px;"> 将文件拖到此处,<em v-if="!disabledUpload">或点击上传(单个文件需小于100M,一次最多上传1000个pdf文件)</em><em v-else>(文件正在上传中,请等待...)</em> </div> </el-upload> <div> <!-- <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload2">手动点击上传</el-button> --> <el-button v-if="showPercent" style="margin-left: 10px;" size="small" type="success" @click="submitAbort">取消后续文件上传</el-button> </div> <div style="color:orange;" v-if="showPercent">上传过程请勿刷新浏览器和跳转其他页面...</div> <!-- 进度条 --> <el-progress v-if="showPercent" :percentage="Number((percentNow*100/percentTotal).toFixed(0))"></el-progress> </div></template><script>import axios from 'axios'export default { data () { return { fileNum: '', // 单词递归上传的文件 upFileList: '',//需要依次上传的待传列表 percentTotal: 0,//总上传个数 percentNow: 0,//当前上传个数 showDesc: '',//结束文案 showPercent: false,//显示上传进度条 time: null,// change事件是否结束 是否可以直接调手动上传事件(目前设置1.5s) disabledUpload: false,//正在上传中 禁止再次选择文件上传 fileData: { },//上传参数 fileList1: [], } }, activated: { // 对于每次进入页面想要刷新的数据,放在这里调用即可 例如 this.getList() }, methods: { // 超出限制个数提示 handleExceed (files, fileList) { console.log('当前限制一次性最多上传1000个文件', files, fileList) this.$message.warning("当前限制一次性最多上传1000个文件") }, changeFile (file, fileList) { this.disabledUpload = true console.log('changeFile', file, fileList) const isLt2M = file.size / 1024 / 1024 < 100 if (!isLt2M) { this.$message.warning('上传文件大小不能超过 100M') // return false // 这个return无效 故去掉 } if (!(file.name.indexOf('.pdf') > -1)) { this.$message.warning("当前仅支持pdf格式的文件上传") // return false // 这个return无效 故去掉 } // 符合条件的进入待传列表 this.upFileList = [] for (let x of fileList) { if (x.raw && (x.name.indexOf('.pdf') > -1) && (x.size / 1024 / 1024 < 100)) {// 过滤掉非pdf 和小于100M的 this.upFileList.push(x.raw) this.percentTotal = this.upFileList.length this.percentNow = 0 this.showPercent = false this.showDesc = '' } } clearTimeout(this.time) this.time = setTimeout(() => { this.time = null console.log('防抖 高频触发后n秒内只会执行一次 再次触发重新计时') this.fnBegin()//说明此时change了所有文件了 可以上传了 }, 1500) }, fnBegin () { console.log('此时change了所有文件 开始上传', this.upFileList) this.submitUpload2() }, // 正式上传掉后端接口 submitUpload2 () { if (this.upFileList.length > 0) { this.showPercent = true this.fileNum = new FormData() // new formData对象 this.fileNum.append('file', this.upFileList[0]) // append增加数据 this.fileNum.append('name', this.upFileList[0].name) // append增加数据 let _vm = this axios({ url: '/chc-shop/api/v1/accident/szcp/electronicfile/upload', headers: { "Content-Type": "multipart/form-data", }, method: "post", data: this.fileNum, }) .then(res2 => { // 每次上传当前一个后 不论成功失败就删除当前这个--如果上传失败想继续传当前这个 就把这两行注释掉 this.percentNow = this.percentNow + 1 this.upFileList.shift() console.log('上传返回', res2) if (res2.data.success) { // this.$message({ // message: "上传成功", // type: 'success' // }) // 进行递归 上传下一个 this.submitUpload2() } else { _vm.$message({ message: res2.data.return_message || '上传失败', type: "error", }) // 进行递归 上传下一个 this.showDesc = '上传结束,部分文件上传失败' this.submitUpload2() } }) .catch(error => { console.log(error) _vm.$message({ message: error || '上传失败', type: "error", }) // 每次上传当前一个后 不论成功失败就删除当前这个--如果上传失败想继续传当前这个 就把这两行注释掉 this.percentNow = this.percentNow + 1 this.upFileList.shift() // 进行递归 上传下一个 this.showDesc = '上传结束,部分文件上传失败' this.submitUpload2() }) } else { this.disabledUpload = false this.showPercent = false this.upFileList = [] //清空待传列表 this.$refs.upload1.clearFiles() this.fileList1 = [] if ((this.percentNow == this.percentTotal) && this.percentTotal) { this.$message.success(this.showDesc ? this.showDesc : '已全部上传成功!') this.percentTotal = 0 this.percentNow = 0 this.showDesc = '' } else if ((this.percentNow == this.percentTotal) && this.percentTotal == 0) { this.$message.warning('请先选择文件!') this.percentTotal = 0 this.percentNow = 0 } else { this.$message.success('已部分上传成功,且取消后续文件上传!') this.percentTotal = 0 this.percentNow = 0 } return false } }, // 终止后需上传 submitAbort () { this.showPercent = false // .abort()不生效,故自己直接将this.upFileList置空 那么就不会走到递归了 就制止后续的上传了 this.upFileList = [] // this.upFileList.forEach(ele => { // this.$refs.upload1.abort(ele) // }) // this.$refs.upload1.abort() // this.$message.warning('已取消后续文件上传!') }, fileErr (err, file, fileList) { this.$message({ message: file.name + '上传失败', type: "error", }) },// 这两个事件不会再触发--因为阻止了自动上传 beforeAvatarUpload (file) { console.log('上传文件前', file) }, msgSuccessOne (data, file, fileList) { console.log('成功', file) }, },};</script>
本文链接地址:https://www.jiuchutong.com/zhishi/300554.html 转载请保留说明!

上一篇:[paper] lift,splat,shooting 论文浅析

下一篇:使用Pytorch实现深度学习的主要流程(pytorch技巧)

  • 掌握这四点,帮你做好区域推广!(帮手的方法)

    掌握这四点,帮你做好区域推广!(帮手的方法)

  • 淘宝推广不可不知的技巧(淘宝推广了还是没有人)

    淘宝推广不可不知的技巧(淘宝推广了还是没有人)

  • iqoo8开发者模式怎么打开(iqoo8开发者模式是干啥的)

    iqoo8开发者模式怎么打开(iqoo8开发者模式是干啥的)

  • 支付宝运动如何邀请好友(支付宝运动如何添加好友)

    支付宝运动如何邀请好友(支付宝运动如何添加好友)

  • vivo x6s A字体怎么改(vivo 手机 字体)

    vivo x6s A字体怎么改(vivo 手机 字体)

  • 苹果xr有hdr显示吗(苹果xr有hdr模式吗)

    苹果xr有hdr显示吗(苹果xr有hdr模式吗)

  • etc不显示蓝牙已开

    etc不显示蓝牙已开

  • qq的匹配聊天怎么开(qq的匹配聊天呢)

    qq的匹配聊天怎么开(qq的匹配聊天呢)

  • 华为怎么重启手机(华为怎么重启手机恢复出厂设置)

    华为怎么重启手机(华为怎么重启手机恢复出厂设置)

  • steamapps是什么文件夹(steamapp在哪个文件夹)

    steamapps是什么文件夹(steamapp在哪个文件夹)

  • 抖音里粉丝和关注的区别(抖音里粉丝和关注的顺序怎么排序的)

    抖音里粉丝和关注的区别(抖音里粉丝和关注的顺序怎么排序的)

  • 打电话通了之后显示用户正忙(打电话通了之后说用户正忙)

    打电话通了之后显示用户正忙(打电话通了之后说用户正忙)

  • 微信怎么发照片合集(微信怎么发照片朋友圈)

    微信怎么发照片合集(微信怎么发照片朋友圈)

  • 淘宝收藏加购是什么意思(淘宝收藏加购是如何设置的)

    淘宝收藏加购是什么意思(淘宝收藏加购是如何设置的)

  • 手机好多压缩包能不能删了(手机里一堆压缩包)

    手机好多压缩包能不能删了(手机里一堆压缩包)

  • qq音乐efe是什么格式(l.i.f.e.音乐qq)

    qq音乐efe是什么格式(l.i.f.e.音乐qq)

  • 系统智能卡服务未启动是什么意思(智能一卡通管理系统)

    系统智能卡服务未启动是什么意思(智能一卡通管理系统)

  • excel图表向导在哪里(excel2007图表向导)

    excel图表向导在哪里(excel2007图表向导)

  • word文档怎么缩小字间距(word文档怎么缩小打印)

    word文档怎么缩小字间距(word文档怎么缩小打印)

  • 三星a50s什么时候上市(三星a50s怎么样)

    三星a50s什么时候上市(三星a50s怎么样)

  • 抖音怎么上传dj视频(抖音怎么上传电视剧视频片段)

    抖音怎么上传dj视频(抖音怎么上传电视剧视频片段)

  • 怎样关闭抖音的青少年模式(怎样关闭抖音的在线状态)

    怎样关闭抖音的青少年模式(怎样关闭抖音的在线状态)

  • vivo快捷中心怎么变回横向(vivo快捷中心怎么设置在下面)

    vivo快捷中心怎么变回横向(vivo快捷中心怎么设置在下面)

  • 微信语音通话可以录音吗手机(微信语音通话可以回放吗)

    微信语音通话可以录音吗手机(微信语音通话可以回放吗)

  • 苹果11有手写功能吗(苹果11手写功能键盘怎么设置)

    苹果11有手写功能吗(苹果11手写功能键盘怎么设置)

  • oppok3有nfc功能吗(oppok3支不支持nfc)

    oppok3有nfc功能吗(oppok3支不支持nfc)

  • ps液化快捷键(ps液化快捷键变成截屏)

    ps液化快捷键(ps液化快捷键变成截屏)

  • 拼多多开团怎么开方法(拼多多开团怎么开的视频)

    拼多多开团怎么开方法(拼多多开团怎么开的视频)

  • jetty和tomcat的区别(tomcat和jvm)

    jetty和tomcat的区别(tomcat和jvm)

  • 快手作品图集原声怎么设置(快手原图在哪里找的)

    快手作品图集原声怎么设置(快手原图在哪里找的)

  • 苹果x清理内存怎么清理(苹果x清理内存在哪里)

    苹果x清理内存怎么清理(苹果x清理内存在哪里)

  • 现金日记账登记错误怎么更正
  • 稳岗补贴属于不征税收入吗
  • 送货单和收据单的区别
  • 个税是否可以跨区缴纳
  • 发票服务名称都有什么
  • 外贸企业出口销售通常采用
  • 快消品行业成本结转方法
  • 厂房无偿租赁合同
  • 企业所得税季度预缴怎么计算
  • 两个单位同一个法人
  • 网上报税费用如何抵扣账务怎么处理?
  • 企业代扣代缴的个人所得税应通过税金及附加科目核算
  • 销售回扣的账务处理办法
  • 租赁费交税税率是多少
  • 税控盘怎么作废发票重新开
  • 个人税务代人开普票
  • 往年银行余额和账目不符怎么调整
  • 单位代收员工退休金会计分录
  • 年报弥补以前年度亏损了还需要填107040表吗
  • 用友软件以前年度损益调整报表勾稽关系不对
  • 税务发票原件
  • 偿还借款利息是现金流量什么项目
  • 注册公司需要注册资金吗
  • 未签订劳动合同工资如何给付
  • 预付加油充值卡可以报销吗
  • 销售部门的固定资产折旧计入什么科目
  • 初级会计应收账款例题
  • mac如何改变照片图库
  • mac系统回到桌面快捷键
  • 担保余值包括
  • 小规模纳税人销售自己使用过固定资产
  • php__call
  • 哈勃太空望远镜取得的部分成果有哪些
  • 浅谈php技术
  • 退款会退货吗
  • 上月开了红字发票当月如何申报
  • 薄雾笼罩怎么写
  • vue中的组件
  • python del语法
  • 企业注销时实收资本清算时要作资产处置收益交所得税吗
  • sql 列转行
  • 医院执行政府会计制度操作指南 .pdf
  • 测绘费 土地增值税
  • 对公账户收到钱都要开票吗
  • 业务招待费汇算清缴账务处理
  • 收到所得税退税怎么做账务处理
  • 投资收益算在营业利润里面吗
  • 房地产企业简易计税和一般计税的区别
  • 长期借款利息计入应付利息吗
  • 固定资产计提折旧的会计科目
  • 一般纳税人车辆租赁费的税率是多少
  • 收到个人所得税手续费返还如何做账
  • 公交卡充值发票怎么开
  • 盈余公积和未分配利润合起来构成
  • 小规模企业所得税优惠政策最新2023
  • windows web server 2008
  • 数据库表的行数
  • navicat 导入
  • ubuntu-
  • win8.1升级到win10
  • ubuntu20.04 u盘
  • 微软称十年内将淘汰程序员
  • linux的特殊权限
  • js动态表格可修改表格数据
  • 常用的批处理文件
  • unity项目怎么运行
  • Eclipse引入jdk1.8
  • dos命令中删除文件命令有哪些
  • unity3d跨平台
  • adb push、adb install 和强制安装
  • python作用域和优先级
  • 第五章推动经济高质量发展心得
  • 基层税务所工作现状
  • 云南省电子税务局怎么改号码
  • 济阳二七大集
  • 定期定额纳税申报表应税项应填哪个数
  • 建筑施工税务处理
  • 湖北税务网上登录
  • 南通国家税务局
  • 河北保定地税局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设