一篇博客解决webuploader ie8下实现多附件上传问题(支持火狐 谷歌 ie8+浏览器,效果更好,做的是ZF项目,所以需要兼容ie8)

先看一下实现效果

 

上传中进度条

上传完成之后效果

现在开始代码实现(新增页面)

首先需要把js css  Uploader.swf 等引入项目中,具体下载地址请看 http://fex.baidu.com/webuploader/download.html

引入地址兼容ie8的情况下,需要加上强制兼容ie模式

接下来复制下边代码到你页面上(选择文件 开始上传用的是layui按钮样式,webuploader原始样式太大太丑了,无奈啊)

<div style="width: 100%; height: 300px;  border: 1px solid white;float:left;">
    <div style="text-align: center;margin-top: 10px;"><span><strong>原文上传</strong></span><span style="color:#F00;">(只可上传五个原文,支持常用文件格式)</span></div>
    <div class="container" style="margin-top: 10px;">
        <div id="uploader" class="wu-example">
            <div id="thelist" class="uploader-list"></div>
            <div class="btns" style="margin-rop:10px;">
                <div id="picker" class="layui-btn layui-btn-xs layui-btn-normal" style="float: left;margin-right: 20px;width:92px;">选择文件</div>
                <input id="ctlBtn" class="layui-btn layui-btn-xs layui-btn-normal" style="width:92px;"  value="开始上传"  />
            </div>
        </div>
    </div>
</div>

接下来复制js到你页面上(里边上传附件个数  大小等限制如下,具体设置请看上边官网地址api)

jQuery(function() {
            var $ = jQuery,
                $list = $('#thelist'),
                $btn = $('#ctlBtn'),
                state = 'pending',
                uploader;
            uploader = WebUploader.create({
                // swf文件路径
                swf: cxt +'webuploader/dist/Uploader.swf',
                // 文件接收服务端。
                server: cxt +'fileManage/tHsapDaAttachment/upload',
                formData : {
                    token:token,source:'t_hsap_da_wenshu',daid:id,datype:1
                },
                // 选择文件的按钮。可选。
                // 内部根据当前运行是创建,可能是input元素,也可能是flash.
                pick: '#picker',
                // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
                resize: false,
                //method: 'POST'
                fileNumLimit: 5,
                fileSizeLimit: 100*1024*1024,
                duplicate: false //可以重复上传
            });
        
            // 当有文件被添加进队列的时候
            uploader.on( 'fileQueued', function( file ) {
                $list.append( '<div id="' + file.id + '" class="item">' +
                    '<h4 class="info">' + file.name + '</h4>' +
                    '<p class="state">等待上传...</p>' +
                    '<p class="remove-this" style="display: inline-block;">删除</p>' +
                    '</div>' );
                // $list.append('<tr class="item"><td class="info">' + file.name + '</td><td>' + '' + '</td><td class="state">' + '等待上传...' + '</td></tr>');
            });
            // 文件上传之前修改formData中数据
            uploader.on('uploadBeforeSend',function (obj,data,headers) {
                data.modelId = $("#modleId").val();
            });
            // 文件上传过程中创建进度条实时显示。
            uploader.on( 'uploadProgress', function( file, percentage ) {
                var $li = $( '#'+file.id ),
                    $percent = $li.find('.progress .progress-bar');
        
                // 避免重复创建
                if ( !$percent.length ) {
                    $percent = $('<div class="progress progress-striped active">' +
                        '<div class="progress-bar" role="progressbar" style="width: 0%">' +
                        '</div>' +
                        '</div>').appendTo( $li ).find('.progress-bar');
                }
        
                $li.find('p.state').attr('text','上传中');
        
                $percent.css( 'width', percentage * 100 + '%' );
            });
            uploader.on( 'uploadSuccess', function( file , response ) {
                $( '#'+file.id ).find('p.state').html('已上传');
                $( '#'+file.id ).find('p.remove-this').attr('id',response.id);//给删除按钮上添加标记 表示已经上传附件,删除的时候需要走后台
            });
        
            uploader.on( 'uploadError', function( file ) {
                $( '#'+file.id ).find('p.state').html('上传出错');
            });
        
            uploader.on( 'uploadComplete', function( file ) {
                $( '#'+file.id ).find('.progress').fadeOut();
            });
            uploader.on( 'all', function( type ) {
                if ( type === 'startUpload' ) {
                    state = 'uploading';
                } else if ( type === 'stopUpload' ) {
                    state = 'paused';
                } else if ( type === 'uploadFinished' ) {
                    state = 'done';
                }
        
                if ( state === 'uploading' ) {
                    $btn.attr('text','暂停上传');
                } else {
                    $btn.attr('text','开始上传!');
                }
            });
            
            uploader.on('error', function (handler,file) {
                if (handler == "Q_EXCEED_NUM_LIMIT") {
                     layer.msg("最多传5个附件!");
                 } else if (handler == "F_DUPLICATE") {
                     layer.msg("文件已存在队列中!");
                 }else if (handler == "Q_TYPE_DENIED") {
                     layer.msg("文件类型不满足!");
                 }else if (handler == "F_EXCEED_SIZE") {
                     layer.msg("文件大小不能超过100MB!");
                 }
           });
            
            $btn.on( 'click', function() {
                if ( state === 'uploading' ) {
                    uploader.stop();
                } else {
                    uploader.upload();
                }
            });
            
            $('#thelist').on('click', '.remove-this', function() {
                   var del_msg=$(this);//ajax 中 this 会改变
                   var del_id=$(this).attr('id');//已上传标记
                   var fileItem = $(this).parent();
                   var id = $(fileItem).attr("id");
                   var daid=$("#id").val();
                   if(del_id != 'undefined' && typeof(del_id) != "undefined"){
                       
                     //调用ajax删除附件表信息及附件
                        $.ajax({
                              type: "post",
                            url : cxt +'fileManage/tHsapDaAttachment/remove',
                            async : false, //同步执行
                            data : {daid:daid,fileId:del_id,token:token},
                            dataType : "json",
                            success : function(data) {
                                if(data.status == "success"){    
                                    uploader.removeFile(id, true);
                                       $(fileItem).fadeOut(function() {
                                           $(fileItem).remove();
                                       });
                                }else{
                                    top.layer.msg('删除附件失败', {
                                          icon: 0,
                                          time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                    }, function(){
                                        
                                    });
                                }
                            },error: function() {
                                top.layer.msg('删除附件失败', {
                                      icon: 0,
                                      time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function(){
                                    
                                });
                            }
                        });
                   }else{
                       uploader.removeFile(id, true);
                       $(fileItem).fadeOut(function() {
                           $(fileItem).remove();
                       });
                   }
                });
         });

后台方法(后台方法可以参考,逻辑自己实现)需要maven中引入hutool

<!-- util工具类 20200910 wyf-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.10</version>
        </dependency>

public final static String UPLOAD_FILE_PATH = "G:/app-mybatis/fileDownload/";//后期优化加到配置文件中

    /**
     *
     * 简要说明:附件上传工具类
     * 编写者:wyf
     * 创建时间:2020-09-10
     * @param
     * @return
     * @throws Exception
     * @throws IllegalStateException
     */
     @PostMapping(value = "upload")
     @ResponseBody
     public String  uploadDocs(MultipartFile file) throws IllegalStateException, Exception{
        String token=request.getParameter(SystemCons.TOKEN_PARAM);//获取token
        String daid=request.getParameter("daid");//主表id
        String source=request.getParameter("source");//来自哪张表
        String datype=request.getParameter("datype");//什么类型 1
        Map<String, Object> uploadData = new HashMap<String, Object>();
        //2020/08/24/T_HSAP_DA_ATTACHMENT_3245839_111.jpg
        //先保存数据,然后再上传附件
        String fileName = file.getOriginalFilename();
        String fileType = fileName.split("\\.")!=null && fileName.split("\\.").length==2?fileName.split("\\.")[1]:"";
        THsapDaAttachment tHsapDaAttachment=new THsapDaAttachment();
        String id=RandomUtil.randomUUID();
        tHsapDaAttachment.setId(id);
        tHsapDaAttachment.setDaid(daid);
        tHsapDaAttachment.setAttachname(fileName);
        tHsapDaAttachment.setApptype(fileType);
        tHsapDaAttachment.setDatype(Integer.parseInt(datype));
        tHsapDaAttachment.setCreattime(System.currentTimeMillis());
        String uploadname=DateUtil.thisYear()+"/"+DateUtil.thisMonth()+"/"+DateUtil.thisDayOfMonth()+"/T_HSAP_DA_ATTACHMENT_"+id+"_"+fileName;
        tHsapDaAttachment.setUploadname(uploadname);
        tHsapDaAttachment.setSource(source);
        tHsapDaAttachmentService.insert(tHsapDaAttachment);
        FileOperation.createFolder(UPLOAD_FILE_PATH+DateUtil.thisYear()+"/"+DateUtil.thisMonth()+"/"+DateUtil.thisDayOfMonth());//如果该父级没有文件夹,则循环创建
        //然后保存附件到对应目录下 hutool工具类上传方法
        File saveFile = new File(UPLOAD_FILE_PATH+uploadname);
        file.transferTo(saveFile);  //进行写入文件
        uploadData.put("code", 0);
        uploadData.put("msg", "上传成功");
        uploadData.put("data", "0");
        uploadData.put("id",id);
        JSONObject json = new JSONObject(uploadData);
        return json.toString();
     }

    /**
     *
     * 简要说明:删除信息
     * 编写者:
     * 创建时间:2020-09-10
     * @param 说明
     * @return 说明
     */
    @PostMapping("remove")
    @ResponseBody
    public R remove() {
        String fileId=request.getParameter("fileId");//附件表id
        String daid=request.getParameter("daid");//关联表id
        //先获取附件路径,然后删除附件再删除数据
        THsapDaAttachment tHsapDaAttachment=tHsapDaAttachmentService.selectById(fileId);
        String filePath=UPLOAD_FILE_PATH+tHsapDaAttachment.getUploadname();
        FileUtil.del(filePath);//删除附件 建议用hutool Io工具类 很好使
        boolean result = tHsapDaAttachmentService.deleteById(fileId);
        if (result) {
            R r=R.ok();
            r.put("status", "success");
            return r;
        } else {
            R r=R.error();
            r.put("status", "error");
            return r;
        }

    }

 

新增方法实现,接下来修改页面及方法

修改页面

<div style="text-align: center;margin-top: 10px;"><span><strong>原文上传</strong></span><span style="color:#F00;">(只可上传五个原文,支持常用文件格式)</span></div>
 <div class="container" style="margin-top: 10px;">
     <div class="wu-example" id="uploader">
         <div class="uploader-list" id="thelist">
         
             <div class="item" th:each="file,Stat:${fileList}" th:id="UPDATE_FILE">
               <h4 class="info" th:text="${file.attachname}"></h4>
               <p class="state">已上传</p>
               <p  th:id="${file.id}"  class="remove-this" style="display: inline-block;">删除</p>
             </div>
             
         </div>
         <div class="btns" style="margin-rop:10px;">
             <div class="layui-btn layui-btn-xs layui-btn-normal" id="picker" style="float: left;margin-right: 20px;width:92px;">选择文件</div>
             <input class="layui-btn layui-btn-xs layui-btn-normal" id="ctlBtn" style="width:92px;" value="开始上传">
         </div>
     </div>
 </div>

修改js

        jQuery(function() {
            var $ = jQuery,
                $list = $('#thelist'),
                $btn = $('#ctlBtn'),
                state = 'pending',
                uploader;
            uploader = WebUploader.create({
                // swf文件路径
                swf: cxt +'webuploader/dist/Uploader.swf',
                // 文件接收服务端。
                server: cxt +'fileManage/tHsapDaAttachment/upload',
                formData : {
                    token:token,source:'t_hsap_da_wenshu',daid:id,datype:1
                },
                // 选择文件的按钮。可选。
                // 内部根据当前运行是创建,可能是input元素,也可能是flash.
                pick: '#picker',
                // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
                resize: false,
                //method: 'POST'
                fileNumLimit: 5,
                fileSizeLimit: 100*1024*1024,
                duplicate: false //可以重复上传
            });
        
            // 当有文件被添加进队列的时候
            uploader.on( 'fileQueued', function( file ) {
                $list.append( '<div id="' + file.id + '" class="item">' +
                    '<h4 class="info">' + file.name + '</h4>' +
                    '<p class="state">等待上传...</p>' +
                    '<p class="remove-this" style="display: inline-block;">删除</p>' +
                    '</div>' );
                // $list.append('<tr class="item"><td class="info">' + file.name + '</td><td>' + '' + '</td><td class="state">' + '等待上传...' + '</td></tr>');
            });
            // 文件上传之前修改formData中数据
            uploader.on('uploadBeforeSend',function (obj,data,headers) {
                data.modelId = $("#modleId").val();
            });
            // 文件上传过程中创建进度条实时显示。
            uploader.on( 'uploadProgress', function( file, percentage ) {
                var $li = $( '#'+file.id ),
                    $percent = $li.find('.progress .progress-bar');
        
                // 避免重复创建
                if ( !$percent.length ) {
                    $percent = $('<div class="progress progress-striped active">' +
                        '<div class="progress-bar" role="progressbar" style="width: 0%">' +
                        '</div>' +
                        '</div>').appendTo( $li ).find('.progress-bar');
                }
        
                $li.find('p.state').attr('text','上传中');
        
                $percent.css( 'width', percentage * 100 + '%' );
            });
            uploader.on( 'uploadSuccess', function( file , response ) {
                $( '#'+file.id ).find('p.state').html('已上传');
                $( '#'+file.id ).find('p.remove-this').attr('id',response.id);//给删除按钮上添加标记 表示已经上传附件,删除的时候需要走后台
            });
        
            uploader.on( 'uploadError', function( file ) {
                $( '#'+file.id ).find('p.state').html('上传出错');
            });
        
            uploader.on( 'uploadComplete', function( file ) {
                $( '#'+file.id ).find('.progress').fadeOut();
            });
            uploader.on( 'all', function( type ) {
                if ( type === 'startUpload' ) {
                    state = 'uploading';
                } else if ( type === 'stopUpload' ) {
                    state = 'paused';
                } else if ( type === 'uploadFinished' ) {
                    state = 'done';
                }
        
                if ( state === 'uploading' ) {
                    $btn.attr('text','暂停上传');
                } else {
                    $btn.attr('text','开始上传!');
                }
            });
            
            uploader.on('error', function (handler,file) {
                if (handler == "Q_EXCEED_NUM_LIMIT") {
                     layer.msg("最多传5个附件!");
                 } else if (handler == "F_DUPLICATE") {
                     layer.msg("文件已存在队列中!");
                 }else if (handler == "Q_TYPE_DENIED") {
                     layer.msg("文件类型不满足!");
                 }else if (handler == "F_EXCEED_SIZE") {
                     layer.msg("文件大小不能超过100MB!");
                 }
           });
            
            $btn.on( 'click', function() {
                if ( state === 'uploading' ) {
                    uploader.stop();
                } else {
                    uploader.upload();
                }
            });
            
            $('#thelist').on('click', '.remove-this', function() {
                   var del_msg=$(this);//ajax 中 this 会改变
                   var del_id=$(this).attr('id');//已上传标记
                   var fileItem = $(this).parent();
                   var id = $(fileItem).attr("id");
                   var daid=$("#id").val();
                   if(del_id != 'undefined' && typeof(del_id) != "undefined"){
                     //调用ajax删除附件表信息及附件
                        $.ajax({
                              type: "post",
                            url : cxt +'fileManage/tHsapDaAttachment/remove',
                            async : false, //同步执行
                            data : {daid:daid,fileId:del_id,token:token},
                            dataType : "json",
                            success : function(data) {
                                if(data.status == "success"){    
                                    //如果是修改回显的附件,则直接删除div即可,如果不是,则需要走uploader删除方法(删除文件队列  删除div等操作)
                                    if(id=="UPDATE_FILE"){
                                        del_msg.parent().remove();
                                    }else{
                                        uploader.removeFile(id, true);
                                           $(fileItem).fadeOut(function() {
                                               $(fileItem).remove();
                                           });
                                    }
                                }else{
                                    top.layer.msg('删除附件失败', {
                                          icon: 0,
                                          time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                    }, function(){
                                        
                                    });
                                }
                            },error: function() {
                                top.layer.msg('删除附件失败', {
                                      icon: 0,
                                      time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function(){
                                    
                                });
                            }
                        });
                   }else{
                        //如果是修改回显的附件,则直接删除div即可,如果不是,则需要走uploader删除方法(删除文件队列  删除div等操作)
                        if(id=="UPDATE_FILE"){
                            del_msg.parent().remove();
                        }else{
                            uploader.removeFile(id, true);
                               $(fileItem).fadeOut(function() {
                                   $(fileItem).remove();
                               });
                        }
                   }
                });
         });


经过一下午调试终于达到预想的效果,如果有什么问题随时@我

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值