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 18 Vue.js
详解vue 组件注册
Nov 20 Vue.js
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
vuex的数据渲染与修改浅析
Nov 26 Vue.js
vue的hash值原理也是table切换实例代码
Dec 14 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
vue postcss-px2rem 自适应布局
May 15 Vue.js
vue实现在data里引入相对路径
Jun 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/10 日漫
网络资源
2006/10/09 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
php实现分页显示
2015/11/03 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
JQUERY获取form表单值的代码
2010/07/17 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
javascript中length属性的探索
2011/07/31 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
Python 字符串定义
2009/09/25 Python
Python编程中的文件操作攻略
2015/10/16 Python
分享Python字符串关键点
2015/12/13 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
使用django实现一个代码发布系统
2019/07/18 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
集体婚礼策划方案
2014/02/22 职场文书
成立公司计划书
2014/05/07 职场文书
体育馆的标语
2014/06/24 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
MySQL Router的安装部署
2021/04/24 MySQL
python not运算符的实例用法
2021/06/30 Python