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 router安装及使用方法解析
Dec 02 Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 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
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
php注入实例
2006/10/09 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
python通过tcp发送xml报文的方法
2018/12/28 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
英国女装网上商店:I Saw It First
2018/10/18 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
财务会计专业毕业生自荐信
2013/10/02 职场文书
大学运动会通讯稿
2014/01/28 职场文书
我爱读书演讲稿
2014/05/07 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS