vue elementUI批量上传文件


Posted in Vue.js onApril 26, 2022

elementUI 如何处理文件批量上传

问题

elementUI的Upload上传组件,通过设置multiple为true,就可以实现多选文件;但是在处理的时候还是一个一个传上去。目前需要在所有文件上传后,将某几个上传错误的结果拼接起来做一次提醒

解决

this.$refs.upload.uploadFiles

该属性可以获取上传的文件相关信息,包括上传后后端返回的response

html

el-upload
  ref='upload'
  class="upload-demo"
  action="https://jsonplaceholder.typicode.com/posts/"
  :on-preview="handlePreview"
  :on-remove="handleRemove"
  :before-remove="beforeRemove"
  multiple
  :on-success='upLoadSuccess'
  accept=".doc,.docx">
  <el-button size="small" type="primary">点击上传</el-button>
  <div slot="tip" class="el-upload__tip">只能上传doc/docx文件</div>
</el-upload>

方法处理 

upLoadSuccess(response, file, fileList) {
    if (this.$refs.upload.uploadFiles) {
        let length = this.$refs.upload.uploadFiles.length
        this.UpLoadFilesLength ++  // 全局变量,用来计算upLoadSuccess方法调用次数
        if (this.UpLoadFilesLength == length) {
            this.UpLoadAllFilesLength = 0  // 如果方法调用的次数和文件列表的长度相同,说明所有文件都上传完毕,将该全局变量置0
            this.resErrorStr() // 该函数处理每个文件上传错误情况下response拼接
        }
    }
},
resErrorStr() {
    if (this.$refs.upload.uploadFiles) { // 如果存在这个值
        let filesList = this.$refs.upload.uploadFiles.slice()
        let UpLoadAllErrorStr = '' // 错误信息拼接变量
        for (let i = 0; i < filesList.length; i++) {
            if (filesList[i].response) {
                if (filesList[i].response.code != 200) { // 如果该文件上传后返回的状态值不是200,则说明该文件上传错误
                    UpLoadAllErrorStr += `${filesList[i].response.message}<br/>`
                }
            }
        }
        if (!UpLoadAllErrorStr) {
            this.$message({ type: 'success', message: '上传文件成功!' });
        } else {
            this.$message({
                type: 'error',
                dangerouslyUseHTMLString: true,
                message: UpLoadAllErrorStr
            });
        }
        this.$refs.uploadAll.uploadFiles = [] // 调用完成之后将值置空,防止再次上传将上次结果也记录下来
    }
},
handleRemove(file, fileList) {
    console.log(file, fileList);
},
handlePreview(file) {
    console.log(file);
},
beforeRemove(file, fileList) {
    return this.$confirm(`确定移除 ${ file.name }?`);
}

elementUI批量上传下载注意事项

批量手动上传文件,和表单数据一起提交

在el-upload组件关键的钩子,其它省略

  • multiple
  • :auto-upload = "false"
  • :file-list = "fileList"
  • :on-change = "selectFile"  (里面是把上传的fileList传给自定义的  this.fileList)

点击上传,将多个文件和表单数据一起上传

a.定义FormData,将表单数据和文件填充到FormData里面

b.自定义请求头部,Content-type:‘multipart/form-data’

let formData = new FormData()
for(let key in data){
    if(data[key]){
      formData.append(key,data[key])
    } 
}
this.fileList.forEach((element,i) =>{
  formData.append('fileList',element.raw)
})
let rs = await axios({
  method:'post',
  url: cfg.uploadURL + '/sp/addSp',
  data: formData,
  headers:{
    'Content-type':'multipart/form-data'
  } 
})

表格中上传文件中,组件钩子函数自带参数

<el-upload
  class="upload-demo"
  action="https://jsonplaceholder.typicode.com/posts/"
  :on-preview="handlePreview"
  :on-remove="handleRemove"
  :before-remove="(file,fileList)=>{
     return beforeRemove(file,fileList,scope.$index)
  }"
  multiple
  :limit="3"
  :on-exceed="handleExceed"
  :file-list="fileList">
  <el-button size="small" type="primary">点击上传</el-button>
  <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
beforeRemove(file,fileList,index){
    console.log(index)
}

批量下载(后台不返回压缩包,前端就一个个下载了)

download(val){
  let vals = val.split(',') //后台返回的文件标识符数组
  vals.forEach((element) =>{
    const iframe = document.createElement("iframe");
    iframe.style.display = "none";
    iframe.style.height = 0;
    iframe.src = cfg.baseURL+'下载路径'+element; 
    document.body.appendChild(iframe); 
    setTimeout(()=>{
      iframe.remove();
    }, 1000)
  })
}
Vue.js 相关文章推荐
vue单元格多列合并的实现
Nov 26 Vue.js
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
浅析vue中的nextTick
Dec 28 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
vue如何实现关闭对话框后刷新列表
Apr 08 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 Vue.js
vue.js 使用原生js实现轮播图
Apr 26 #Vue.js
如何vue使用el-table遍历循环表头和表体数据
vue 把二维或多维数组转一维数组
Apr 24 #Vue.js
Vue OpenLayer 为地图绘制风场效果
Apr 24 #Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
vue @click.native 绑定原生点击事件
Apr 22 #Vue.js
vue实现省市区联动 element-china-area-data插件
You might like
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
thinkphp的c方法使用示例
2014/02/24 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
JS解析XML的实现代码
2009/11/12 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
python3 模拟登录v2ex实例讲解
2017/07/13 Python
详解python基础之while循环及if判断
2017/08/24 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
对python中dict和json的区别详解
2018/12/18 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Django如何将URL映射到视图
2019/07/29 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
幼儿园八一建军节活动方案
2014/08/27 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript