layui多文件列表上传+上传中loading效果

描述

项目中实际使用的例子,不是单一个上传。

是添加公告、添加帖子等等模块中的一个功能。

从layui官网的例子做一些改动,没有进度条(太难了),而是在每一行加了loading效果。

此功能是选择文件后直接上传。

如果用的官网例子,选择文件先不上传的那种,改一下不难。

功能描述

点击选择文件按钮,选择文件后在表格追加一行,直接上传

上传中:

上传成功:

删除的是文件的id,入表时的关联字段,不需要可删除(官网例子中删除的是上传列表中的数据)

上传失败:

这里没图,就是状态为:上传失败,没有操作按钮(官网例子中有重传按钮功能)

 

 实施

attachmentId:字符串。如公告表中的字段attachmentId,表示关联的文件id(id+逗号)[1001,1002,1003,1004,]

html

<input>是用来放已上传文件的id(形如:attachmentId="id1,id2,id3,"),用来入表的。

<input type="text" id="attachmentId" style="display: none">
<div class="layui-form-item">
    <div class="layui-upload">

        <div class="layui-upload-list">
            <table class="layui-table">
                <thead>
                <tr><th>文件名</th>
                    <th>大小</th>
                    <th>状态</th>
                    <th>操作</th>
                </tr></thead>
                <tbody id="demoList"></tbody>
            </table>
        </div>
        <button type="button" class="layui-btn layui-btn-normal" id="testList">选择文件</button>
    </div>
</div>

 js

layui.use(['upload'], function(){
        var upload = layui.upload;
        //多文件列表上传
        var attachmentId = "";//上传的文件id串
        var demoListView = $('#demoList')
            ,uploadListIns = upload.render({
            elem: '#testList'
            ,url: ...
            ,accept: 'file'
            ,multiple: true
            ,auto: true
            ,before: function(obj){
                
            }
            ,choose: function(obj){
                var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
                //读取本地文件
                obj.preview(function(index, file, result){
                    var tr = $(['<tr id="upload-'+ index +'">'
                        ,'<td>'+ file.name +'</td>'
                        ,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>'
                        ,'<td><i class="layui-icon layui-icon layui-anim layui-anim-rotate layui-anim-loop">&#xe63d;</i></td>'
                        ,'<td>'
                        ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete layui-hide">删除</button>'
                        ,'<input class="layui-hide" type="text" id='+index+'>'
                        ,'</td>'
                        ,'</tr>'].join(''));

                    //删除
                    tr.find('.demo-delete').on('click', function(){
                        var tem = $("#"+index).val();
                        attachmentId = attachmentId.replace(tem,"");
                        $("#attachmentId").val(attachmentId);
                        delete files[index];
                        tr.remove();
                        uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
                    });

                    demoListView.append(tr);
                    delete files[index];
                });

            }
            ,done: function(res, index, upload){
                var data = res;
                var attachmentId_tem = data.fileName + ",";
                $("#"+index).val(attachmentId_tem);
                attachmentId += (attachmentId_tem);
                $("#attachmentId").val(attachmentId);
                if("这里可以加上自己的判断"){ //上传成功
                    var tr = demoListView.find('tr#upload-'+ index)
                        ,tds = tr.children();
                    tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
                    tds.eq(3).find('.demo-delete').removeClass('layui-hide'); //显示删除
                    return delete this.files[index]; //删除文件队列已经上传成功的文件
                }
                this.error(index, upload);
            }
            ,error: function(index, upload){
                var tr = demoListView.find('tr#upload-'+ index)
                    ,tds = tr.children();
                tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>');
                return delete this.files[index];
            }

        });


    })

修改

在修改功能中,需要回显已上传列表,并且可以删除已上传文件。

把上面代码中的的id改一下就行,其他基本不用改,或者想办法复用上面的代码也可以,我自己没复用。

用attachmentId查出已上传的文件(或者说已关联的文件),下面是ajax请求中success中的处理。

success: function (res) {
    var data = res.list;
    for (var i=0;i<data.length;i++) {
        var tr = $(['<tr id="upload-'+ i +'">'
            ,'<td>'+ data[i].uploadFileName +'</td>'
            ,'<td>'+ data[i].fileSize +'kb</td>'
            ,'<td><span style="color: #5FB878;">已上传</span></td>'
            ,'<td>'
            ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete2">删除</button>'
            ,'<input class="layui-hide attId" value="'+data[i].id+'," type="text">'
            ,'</td>'
            ,'</tr>'].join(''));
        $('#demoList2').append(tr);

    }
    // 已有文件删除
    $('.demo-delete2').on('click', function(){
        var attachmentId2 = $("#attachmentId2").val();
        var tem = $(this).parents("tr").find(".attId").val();
        attachmentId2 = attachmentId2.replace(tem,"");
        $("#attachmentId2").val(attachmentId2);
        $(this).parents("tr").remove();
    });
}

 

结语

还有一些小的页面bug,自己多测一下(比如打开弹出层时先清空文件表格的html,否则上传之后关闭弹框再打开会出现上次的内容)

整个功能都围绕attachmentId,一定注意。

还有就是和进度条的集成,查出来的都是改源码那一套,试了好久没什么用,而且也不是实时进度,有好的方法可以交流。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好,关于多个文件上传和提交同时进行的控制,可以使用 layui.upload 的 before 函数来实现。 示例代码如下: ``` layui.use('upload', function(){ var upload = layui.upload; //多文件列表示例 var demoListView = $('#demoList'), uploadListIns = upload.render({ elem: '#testList', url: '/upload/', accept: 'file', multiple: true, auto: false, bindAction: '#testListAction', choose: function(obj){ var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列 //读取本地文件 obj.preview(function(index, file, result){ var tr = $(['<tr id="upload-'+ index +'">', '<td>'+ file.name +'</td>', '<td>'+ (file.size/1014).toFixed(1) +'kb</td>', '<td>等待上传</td>', '<td>', '<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>', '<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>', '</td>', '</tr>'].join('')); //单个重传 tr.find('.demo-reload').on('click', function(){ obj.upload(index, file); }); //删除 tr.find('.demo-delete').on('click', function(){ delete files[index]; //删除对应的文件 tr.remove(); uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选 }); demoListView.append(tr); }); }, before: function(obj){ layer.load(); //上传loading //模拟loading setTimeout(function(){ layer.closeAll('loading'); }, 2000); }, done: function(res, index, upload){ if(res.code == 0){ //上传成功 var tr = demoListView.find('tr#upload-'+ index), tds = tr.children(); tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>'); tds.eq(3).html(''); //清空操作 return delete this.files[index]; //删除文件队列已经上传成功的文件 } this.error(index, upload); }, error: function(index, upload){ var tr = demoListView.find('tr#upload-'+ index), tds = tr.children(); tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>'); tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传 } }); }); ``` 其,before 函数用于上传之前的处理,这里可以添加 loading 等提示信息,确保上传过程用户可以看到正在处理。 另外,由于 layui.upload 是基于 layui.form 实现的,所以在页面需要有一个 form 标签,同时需要设置一个 bindAction 参数指向提交按钮,这样在上传完成后才能触发表单提交。 希望这个示例代码能够帮助到您。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值