关于layui 多文件上传一些问题

关于layui 多文件上传一些问题

前言:

最近使用layui文件上传模块实现批量上传图片遇到一些问题,包含:批量上传实时进度条,选中文件总数统计以及上传完成的文件统计。这篇文章主要是总结使用layui上传模块过程中遇到一些问题以及解决思路,这里不对layui文件上传模块做过多介绍,使用前建议阅读
layui官方文档:https://www.layui.com/doc/modules/upload.html
github源码:https://github.com/sentsin/layui/blob/master/src/lay/modules/upload.js

问题一

目标: 实现上传前选中文件之后统计选中文件的数量
问题描述: 通过官方文档可以知道choose参数后面是选中文件之后的回调函数

下面是示例选中两个图片文件,可以看到files队列中已经push两个文件,这两个文件是以map形式存入,但是obj中并没有提供获取队列长度的方法

问题解决: 这个问题其实很简单,files是一个Object类型,我们都知道,在js中,Object有一个Object.keys(obj)方法,该方法传入一个obj对象,返回值为一个表示给定对象的所有可枚举属性的字符串数组
直接上代码:

choose: function choose(obj) {
			files = this.file = obj.pushFile();
			obj.preview(function (index, file, result) {
				imgCount = Object.keys(files).length;

			});
		}  


上图可以看到我们已经获取到选中文件的个数!

问题二

目标: 实现上传时进度条展示
问题描述: 目前layui的文件上传模块是没有引入进度条显示的
问题解决1: 参考文章:https://blog.csdn.net/qq_36311372/article/details/82117417
我们需要修改layui文件上传模块的源码(src/lay/modules/upload.js)

代码片段:

xhr:function () {
    var newXhr = i.ajaxSettings.xhr();
    // 给xhr的upload添加progress的监听
    newXhr.upload.addEventListener('progress' , function (e) {
    	var percent = Math.floor(e.loaded / e.total * 100); //计算出进度
    	typeof l.progress === 'function' && l.progress(e , percent); // 传递给upload的progress回调
    });
    return newXhr;
}
 

在upload.render中使用:

	progress: function(e , percent) {
		element.progress('progressBar',percent  + '%');
	},
	choose: function(obj) {
    	files = this.file = obj.pushFile();
    	obj.preview(function (index, file, result) {
    		imgCount = Object.keys(files).length;
    
    	});
	}
 

但是这里实现的是单个文件上传的进度条,那批量上传就会出现进度条不断重复的问题(这里指的是批量上传文件时只展示一个进度条),如下图所示

问题解决2: 既然我们知道这个进度条是针对一个文件的,那我们只要把文件的完成个数/文件总数就能得到百分比,这里我们就要使用到问题一中刚刚得到的文件总数量。
代码片段:

	progress: function(e , percent) {
		if(percent == 100) content++; //content是图片上传完成的个数
		var per = Math.floor(content / imgCount * 100); //per是批量完成进度
		element.progress('progressBar', per + '%');
	}

实现效果:

问题三

问题描述: layui文件上传模块的选中文件队列只提供了pushFile方法,并没有提供清除队列的方法(可能是我对源码理解不透,有大神知道的欢迎来指出)。在这种场景下,要是选错文件又不能清除之前选错的文件,那就很尴尬了。
问题解决: 参考文章:https://blog.csdn.net/u014598014/article/details/90559211
只要在每次选择文件的回调函数(也就是choose)中加入以下代码即可
代码片段:

	choose: function(obj) {
		for (let x in files) {  //先来个for循环清空队列
			delete files[x];
		}
    	files = this.file = obj.pushFile();
    	obj.preview(function (index, file, result) {
    		imgCount = Object.keys(files).length;
    
    	});
	}
问题四

问题描述: 统计上传成功与失败的文件个数
问题解决: layui上传文件模块其中有三个回调函数:done 、allDone 、error
done: 每个文件上传完的回调
allDone: 全部文件上传完的回调
error: 文件上传失败时的回调
代码片段:

未完待续

暂时先到这,以后遇到关于该模块的问题,再做更新

后语

若有错误不当之处,还望大家批评指正。一起学习进步

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值