2021-09-30 工作记录--LayUI-多图上传时,通过进度条来展示上传进度

LayUI-多图上传时,通过进度条来展示上传进度

这个需要实现滴效果是:多图上传时,根据所有图片上传的进度来展示进度条的变化,进度条初始值为空,随着图片的上传,慢慢滴由空到100%(100%表示上传成功)

知识点:动态操作进度条
在这里插入图片描述
实现效果如下图所示:
在这里插入图片描述
对应代码如下:

HTML

<div class="layui-form-item">
            <div class="layui-upload" style="width: 50%">
                <input type="hidden" name="imgs" style="width: 100%" value="{$user.imgs|default=''}">
                <input type="hidden" name="all_thumb_tmp" style="width: 100%" value="{$user.imgs|default=''}">
                <input type="hidden" name="all_thumb_tmp_local" style="width: 100%" value="">
                <!-- 多图上传按钮 -->
                <button type="button" class="layui-btn" id="test2">多图上传</button>
                <!-- 预览图 -->
                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
                    预览图:
                    <div class="layui-upload-list" id="demo2">
                        <!-- PHP遍历 -->
                        {foreach name="$user['thumb']" item="v"}
                        <img src="{$v}" class="layui-upload-img xc" />
                        <!-- 图片右上角的删除按钮 -->
                        <span class="sxspan"  onclick="dj(this)" key="">
                            <!-- 图片右上角的删除按钮图片 -->
                            <img src="/static/admin/image/xcdel.png" style="width: 100%" alt="">
                        </span>
                        {/foreach}
                    </div>
                </blockquote>
                <!-- 进度条 -->
                <div class="layui-progress layui-progress-big multipleImgs" lay-filter="demo" lay-showPercent="true">
                    <div class="layui-progress-bar" lay-percent="0%"></div>
                </div>
                <!-- 按钮-开始上传 -->
                <div style="margin-bottom: 20px;">
                    <button type="button" class="layui-btn" id="btnimage">开始上传</button>
                </div>
            </div>
        </div>

CSS

.layui-upload-img {width: 92px;height: 92px; margin: 0 10px 10px 0; border: 1px solid #f3f3f3; }
.sxspan{
        position: relative;
        right: 17px;
        display: inline-block;
        width: 15px;
        height: 15px;
        top: -51px;
}
.multipleImgs {
    width: 92px;
    margin-bottom: 8px;
}

JS

 //多图上传
    var count=0; // 图片个数
    // imgnumber和max_number需要搭配使用,且最好设置成相同值
    var imgnumber = 20; // 每次选择图片时 可选择图片加到预览图的数量
    var max_number = 20; // 自定义:可上传的预览图里的图片数量
    var files = '';

	var indexload; // 加载框

    // 下面两个变量与传入图片的进度条有关
    var num = 0; // 未传入图片时,初始值设为0;传入图片后,依次根据图片数量+1
    var n; // 图片个数(因为自带count可以表示图片个数,所以这里不需要了)

    layui.use(['upload','element','layer'], function() {
        var $ = layui.jquery,
            upload  = layui.upload,
            element = layui.element,
            layer   = layui.layer;
        upload.render({
            elem: '#test2'
            ,url: "{:url('Common/uploadTwoHundred')}"
            ,multiple: true
            ,accept: 'images'
            ,number:imgnumber
            ,auto:false
            ,bindAction: '#btnimage'
            ,acceptMime: 'image/*'
            ,choose:function(obj){
                var flag = true;
                obj.preview(function(index, file, result){
                    //预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
                    if(count >= max_number){
                        flag = false;
                        delete files[index];
                        layer.msg('超过文件限制');
                        return false;
                    }else{
                        files = obj.pushFile(); // 将每次选择的文件追加到文件队列
                        $('#demo2').append('<img  src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img xc"><span class="sxspan"  οnclick=dj(this,"'+index+'") key="'+count+'"><img src="/static/admin/image/xcdel.png" style="width: 100%" alt=""></span>')
                        count ++
                    }
                    //ob.resetFile(index, file, '123.jpg'); //重命名文件名,layui 2.3.0 开始新增
                    //这里还可以做一些 append 文件列表 DOM 的操作
                    //obj.upload(index, file); //对上传失败的单个文件重新上传,一般在某个事件中使用
                    //delete files[index]; //删除列表中对应的文件,一般在某个事件中使用
                });
            }
            ,before: function(obj){

                // 获取传入的图片个数(因为自带count可以表示图片个数,所以这里不需要了)
                // n = Object.getOwnPropertyNames(files).length; // 图片个数
                // console.log(n);

                if (count==0){
                    layer.msg('没有可上传的本地文件');
                    return false;
                }
                if(JSON.stringify(files)!="{}"){

                    // 进度条初始时
                    element.progress('demo', '0%'); //进度条复位
                    layer.msg('上传中', {icon: 16, time: 0}); // 提示框(0ms后会自动关闭)
					indexload = layer.load(1, {time: 10*1000,offset: 'auto'}); // 加载框-图片上传完之前不能进行其他操作
                }else{
                    layer.msg('没有可上传的本地文件')
                }
            }
            ,done: function(res,index){
                console.log(res);
                delete files[index];

                num++; // 传入一张图片后,num依次+1
                console.log(num);
                var finalNum = num / count * 100;
                console.log(finalNum + '%');

                if(res.code == 200){

                    // 上传图片时的进度条
                    element.progress('demo', finalNum + '%'); //可配合 layui 进度条元素使用
                    if(JSON.stringify(files) == "{}"){ // 也可以写成:if(finalNum == 100){,但在其它需要判断是否上传完毕的地方最好不要这样写哟
                        layer.msg('上传完毕', {icon: 1,time: 1000},function () {
                            layer.close(indexload); // 关闭加载框indexload(因为load默认是不会自动关闭的),可以进行其它操作了
                        });
                    }

					console.log(res);
					
					// 下面内容根据项目需求进行更改
                    var allimage =  $('input[name=all_thumb]').val();
                    var allimage_tmp =  $('input[name=all_thumb_tmp]').val();
                    var allimage_tmp_local =  $('input[name=all_thumb_tmp_local]').val();

                    if(allimage == ''){
                        $('input[name=all_thumb]').val(res.imgpath)
                        $('input[name=all_thumb_tmp]').val(allimage_tmp )
                        $('input[name=all_thumb_tmp_local]').val(res.imgpath)

                    }else{
                        $('input[name=all_thumb]').val(allimage+','+res.imgpath) // 存放最开始一来就有的和新上传的图片地址的原图
                        $('input[name=all_thumb_tmp]').val(allimage_tmp) // 存放最开始一来就有的图片地址的缩略图
                        $('input[name=all_thumb_tmp_local]').val(allimage_tmp_local+","+res.imgpath) // 存放新上传的图片地址【最后提交时,需在其最后结果后面加上.substring(1),使其去掉最前面的逗号】


                    }


                }
            }
        });
    })

	// 图片右上角的删除符号的点击事件-删除图片
    function dj(obj,index){
        num--; // 删除一张图片后,num依次-1
        var indexss=  $('#demo2 span').index(obj); // 索引值
        $(obj).prev().remove(); // 删除图片
        $(obj).remove(); // 删除叉图标
        var allimage =  $('input[name=imgs]').val();
        var allimage_tmp =  $('input[name=all_thumb_tmp]').val();
        var allimage_tmp_local =  $('input[name=all_thumb_tmp_local]').val();

        if (allimage == null) {
            return;
        }
        var arr =  allimage.split(',');
        var arr_tmp =  allimage_tmp.split(',');
        var arr_tmp_local =  allimage_tmp_local.split(',');
        arr.splice(indexss, 1) // 删除一张对应索引值的图片原图地址
        arr_tmp.splice(indexss, 1) // 删除一张对应索引值的图片缩略图地址
        arr_tmp_local.splice(indexss, 1) // 删除一张对应索引值的新增图片的地址

        $('input[name=imgs]').val(arr.join(','));
        $('input[name=all_thumb_tmp]').val(arr_tmp.join(','));
        $('input[name=all_thumb_tmp_local]').val(arr_tmp_local.join(','));
        count--;
        if (index!=undefined){
            delete  files[index];
        }
    }

在这里插入图片描述
红色下划线中的files != ""不能写成JSON.stringify(files) != "",因为:
在这里插入图片描述
在这里插入图片描述
【补充知识】上面代码中有一个很重要的知识点:获取传入的图片的个数Object.getOwnPropertyNames(files).length;,因为传入图片是一个对象,这里就采用的js获取对象属性个数的方法
这个方法参考自某优秀博主的博客:https://www.cnblogs.com/ooo0/p/6534333.html里的方法三,以防博主删除该篇博客,所以截图方法三如下:
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呀小萝卜儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值