我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么使用el-upload组件实现递归多文件上传

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么使用el-upload组件实现递归多文件上传

本篇内容介绍了“怎么使用el-upload组件实现递归多文件上传”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    一、需求描述:

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

    二、问题阐述:

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

    三、解决方法:

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

    四、实现思路:

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

    怎么使用el-upload组件实现递归多文件上传

    主要逻辑详解:

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

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

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

    因为我是想减少服务器压力,既在上一个文件上传结束后,再去上传下一个文件。故,我采用了递归一次传一个(递归逻辑在submitUpload2事件里)。同样的,如果你想只调用一次接口,将1000个文件传给后端,那么你就将submitUpload2递归事件给修改调,改成调一次接口,传所有file文件数组即可(具体看你们后端的数据结构)。

    因为是上传多个文件,时间肯定长,如果你不想继续传递后续文件,就调用submitAbort即可。但是element文档说的abort()取消上传事件不生效。所以我是直接将上传列表给置空了,所以递归也就结束了就不传递了。

    同样因为上传时间长,我就设置了进度条(当前已上传的个数/所有需要上传个数)。但是你如果切换到其他页面的话,再切换到当前上传vue页面,因为生命周期原因导致看不到上传进度。所以可以将这个上传vue页面使用keep-alive进行路由缓存,这样除了刷新浏览器外,切换到当前页还是会读缓存会看到上传进度。(如果你既想要缓存进度条,又想要刷新页面的list等某些数据,那么你缓存此页面,然后在activated单独调获取list数据方法即可)。

    因为我的需要是,选择文件成功后,默认去上传,所以我是在防抖事件后就去调递归上传了。正常情况下,其实需要点击这个按钮然后去上传的,既手动点击上传(被注释掉了)<!-- <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload2">手动点击上传</el-button> -->

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

    <template>  <div class="group_insurance_order1" >    <!--      :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" >        将文件拖到此处,<em v-if="!disabledUpload">或点击上传(单个文件需小于100M,一次最多上传1000个pdf文件)</em><em v-else>(文件正在上传中,请等待...)</em>      </div>    </el-upload>     <div>      <!-- <el-button  size="small" type="success" @click="submitUpload2">手动点击上传</el-button> -->      <el-button v-if="showPercent"  size="small" type="success" @click="submitAbort">取消后续文件上传</el-button>    </div>     <div  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>

    “怎么使用el-upload组件实现递归多文件上传”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    怎么使用el-upload组件实现递归多文件上传

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    怎么使用el-upload组件实现递归多文件上传

    本篇内容介绍了“怎么使用el-upload组件实现递归多文件上传”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、需求描述:在页面上点击按钮
    2023-07-05

    Element el-upload上传组件怎么使用

    今天小编给大家分享一下Element el-upload上传组件怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。upl
    2023-06-30

    elementUI怎么使用el-upload上传文件

    本篇内容介绍了“elementUI怎么使用el-upload上传文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Element Uploa
    2023-07-05

    vue怎么使用el-upload实现文件上传功能

    这篇文章主要介绍了vue怎么使用el-upload实现文件上传功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么使用el-upload实现文件上传功能文章都会有所收获,下面我们一起来看看吧。uploa
    2023-06-30

    vue3中怎么使用el-upload上传文件

    本文小编为大家详细介绍“vue3中怎么使用el-upload上传文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3中怎么使用el-upload上传文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。el-
    2023-07-06

    el-upload大文件切片上传怎么实现

    这篇文章主要介绍“el-upload大文件切片上传怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“el-upload大文件切片上传怎么实现”文章能帮助大家解决问题。html
    2023-07-05

    怎么使用el-menu递归实现多级菜单组件

    今天小编给大家分享一下怎么使用el-menu递归实现多级菜单组件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 效果:2
    2023-07-06

    elementui使用el-upload组件如何实现自定义上传

    这篇文章主要介绍了elementui使用el-upload组件如何实现自定义上传,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-13

    element el-upload文件上传覆盖第一个文件怎么实现

    这篇文章主要介绍“element el-upload文件上传覆盖第一个文件怎么实现”,在日常操作中,相信很多人在element el-upload文件上传覆盖第一个文件怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
    2023-07-05

    怎么使用vue递归实现树形组件

    这篇文章主要介绍“怎么使用vue递归实现树形组件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用vue递归实现树形组件”文章能帮助大家解决问题。1. 先来看一下效果:2. 代码部分 (myTr
    2023-07-02

    uniapp使用u-upload组件来实现图片上传功能

    最近在用uniapp开发微信小程序,下面这篇文章主要给大家介绍了关于uniapp使用u-upload组件来实现图片上传功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-03

    vue递归组件怎么实现elementUI多级菜单

    这篇“vue递归组件怎么实现elementUI多级菜单”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue递归组件怎么实现e
    2023-07-02

    组件中多个el-upload存在导致上传图片失效问题怎么解决

    本篇内容介绍了“组件中多个el-upload存在导致上传图片失效问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!组件中多个el-u
    2023-07-05

    怎么使用Vue递归组件实现树形菜单

    本文小编为大家详细介绍“怎么使用Vue递归组件实现树形菜单”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Vue递归组件实现树形菜单”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下图,点击后打开二级
    2023-07-04

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录