vue批量上传,使用el-upload实现文件批量上传。只调用一个请求,只需要一个上传按钮。背景介绍
需求背景后端需要批量处理上传的文件。原生el-upload批量上传会多次调用上传接口。不支持一次调用前端,需要对选中的文件进行批量验证。2.使用el-upload因为:
该项目是基于Hungry.com组件库开发的,我们不想引入其他组件进行开发;对本机输入实现上传式处理也很困难。网上看了大家的实现方案,发现替代方案是使用input进行批量上传;使用el-upload的场景需要两个按钮【选择文件、上传】来实现上述需求。考虑到这样的交互不是很友好,所以用自己的方式来实现。
一、实现效果
先说一下实现的效果。单击上传按钮,将弹出文件选择弹出窗口。选择后直接调用上传接口进行上传。只调用一个接口。
项目效果功能效果
请求模板代码请求代码
二、具体说明
data(){return{uploadCfg:{fileList:[],//默认绑定文件列表validFileList:[]//验证通过的文件列表}};}
我们来解释一下上面模板中两个重要的组件属性。
上传文件前验证:至少包含一个excel文件;如果验证通过,则请求接口;如果验证失败,则终止接口请求,并提示验证失败。
/***@desc上传前文件验证*@paramfile当前文件*/handleBeforeUpload(file){letvm=this;returnnewPromise((resolve,reject)={//收集文件列表this.uploadCfg.validFileList.push(file);//验证文件列表vm.handleDebounceVarifyFile();setTimeout(function(){if(!_.isEmpty(vm.uploadCfg.validFileList)){解析(true);}else{拒绝(true);}},100);});}
可以看到这里返回了Promise。看一下官方的解释,如下图。表示支持Promise返回结果。下面解释一下为什么不直接返回false的原因。
el-upload的handleBeforeUpload在批量上传时会被多次触发,即选择多个文件后会被调用多次。我们的要求是它必须至少包含一个Excel文件。此时需要将所有选中的文件收集起来进行批量上传。对于验证来说,单次触发是不够的,所以这里使用了一个【防抖功能】handleDebounceVarifyFile,通过短时间内触发最后一次来达到批量验证文件的效果。
因为会被触发多次,所以这里的验证函数返回的是一个Promise。下面是防抖功能的逻辑描述。您可以根据自己的应用场景来开发这里的逻辑。
/***@desc防抖触发文件上传前,保证批量验证*/handleDebounceVarifyFile:_.debounce(function(){letexcel_file={};if(_.isEmpty(this.uploadCfg.validFileList)){return;}excel_file=this.uploadCfg.validFileList.find(item={return/\.(xls)|\.(xlsx)$/.test(item.name);});//如果文件验证不合理,清除合法文件列表并提示if(_.isEmpty(excel_file)){this.uploadCfg.validFileList=[];this.$message.warning('至少上传一个xls或xlsx格式的文件!');}},20)
这里采用的是自定义上传方式,与上传前验证相同。el-ipload默认会多次调用上传接口。我们要做的也是利用防抖的思想来控制最后一次触发上传回调时的结构。批量文件数据,请求接口,以下是具体代码:
/***@desc自定义上传*/handleUploadHttp(){this.handleDebounceUpload();}/***@desc防抖触发文件上传前,保证批量上传*/handleDebounceUpload:_.debounce(function(){if(_.isEmpty(this.uploadCfg.validFileList)){return;}letformData=newFormData();this.uploadCfg.validFileList.forEach((item_file)={formData.append(`files`,item_file);});batchUploadApi.uploadXsxx(formData).then(()={this.$message.success('附件已上传成功,请等待数据入库!');this.uploadCfg.validFileList=[];}).catch(err={console.log('批量上传的附件失败',err);});},20)
三、结语
至此,我个人认为已经完美解决了问题。分享出来,希望可以帮助到有同样问题的人~
大家好,今天小编关注到一个比较有意思的话题,就是关于培训学校小升初政策文件的问题,于是小编就整理了3个相关介绍培训学校小升初政策文件的解答,让我们一起看看吧。四…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训学校决策文件范本的问题,于是小编就整理了3个相关介绍培训学校决策文件范本的解答,让我们一起看看吧。幼儿园…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训学校咨询文件模板的问题,于是小编就整理了2个相关介绍培训学校咨询文件模板的解答,让我们一起看看吧。家长去…
大家好,今天小编关注到一个比较有意思的话题,就是关于学校培训报销规定文件的问题,于是小编就整理了2个相关介绍学校培训报销规定文件的解答,让我们一起看看吧。202…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训学校文件的管理的问题,于是小编就整理了1个相关介绍培训学校文件的管理的解答,让我们一起看看吧。静默管理什…
2024-10-30 00:51:08
2024-10-29 22:30:06
2024-10-29 20:30:48
2024-10-29 12:42:06
2024-10-29 10:09:07
大家好,今天小编关注到一个比较有意思的话题,就是关于起电脑培训中心的名字的问题,…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训学校清明体验课的问题,于…