zoukankan      html  css  js  c++  java
  • js 无刷新文件上传 (兼容IE9 )

     之前项目中有个文件上传了需求,于是直接就使用了FormData对象异步上传,但是在测试得时候发现ie9无法正常上传(项目要求兼容IE9+),无奈,查资料得知IE9- 版本不支持formdata对象得异步上传!

    怎么办呢?那就用表单提交吧。之前异步上传得接口后台返回的是JSON串,表单提交的话IE会提示将后台返回的json数据保存到本地,影响体验,无奈又让后台写了一个接口返回页面。

    所以下面针对ie9又用了不同的接口,如果使用同一个接口返回的格式不能为json,最好为xml/html  。

    为了页面不刷新,参考了公用得做法,直接将formtarget给了隐藏的iframe,这样表单提交后iframe就能处理提交后返回的数据,保持原始页面不被刷新,然后检测iframe是否加载完成,如果iframe接收到后台的数据加载完成得话,则证明form表单提交成功,代表文件上传成功。然后刷新当前页面展示已经上传得文件信息。

    下面是主要代码:

    //这里是html部分
    <
    form id="fileUploadF" method="post" target="formUpFile" class="form form-group text-right" enctype="multipart/form-data"> <input type="file" id="fileUpIpt" class="fileUpIpt form-inline" accept="*/*" name="files" multiple="multiple" > <input type="hidden" name="qblcId" value="${qblcId}"> <button id="btn_uploadfile" class="btn btn-sm btn-default upload-btn"> 上传附件 </button> </form>
    <iframe id="formUpFile" border="none" width="0" height="0" name="formUpFile"></iframe>

    js部分

    //绑定click事件,监听提交按钮
    $("#btn_uploadfile").click(function(){
            $("#fileUpIpt").trigger("click");//触发input[type=file]上传
            return false;
    });
    
    // 监听iframe是否加载完成              
    $('formUpFile').load (function(){
          location.reload();//加载完成执行刷新
    })
        
    //监听是否上传新的文件            
    $("#fileUpIpt").change(function(){
         if($(this).val() != ""){
              try{//尝试直接使用异步上传
                    var formData = new 
                         FormData(document.getElementById("fileUploadF"));
                    ajaxFileUpload(formData);
                     return false;
                    }catch(err){ //如果不支持异步上传则使用表单提交   
                      //给form添加action地址并执行提交
                       $("#fileUploadF")
                        .attr("action","/TY/uploadFileforie9").submit();
                                
                }
           }  
                        
    })

    以下就是ajax 文件上传的函数部分,不做过多解释,这里添加了上传进度条

    //ajax文件上传主函数
     function ajaxFileUpload(datas){
          var index;
          $.ajax({
                type:"post",
                url:"${appPath }/TY/uploadFile",
                async:true,
                data:datas,
                contentType: false,  
                processData: false,  
                xhr:function(){
                var xhrObj = $.ajaxSettings.xhr();
                 if(onprogress && xhrObj.upload) {
                     xhrObj.upload.addEventListener("progress" , onprogress, false);
                           return xhrObj;
                         }                
                        },
                 success:function(res){
                       if(res.checkResult == "1"){                            
                           var fileList = res.result.files,addStr = "";
                           $.each(fileList, function(i,item) {
                           var fileNames = '<td><span class="glyphicon glyphicon-file" aria-hidden="true"></span>&nbsp; '+item.doc_name+'</td>'
                                    addStr += '<tr><td>'+(i+1)+'</td>'+fileNames+'<td><span onclick="delectFile(\''+item.doc_id+
                                        '\')" class="glyphicon glyphicon-trash del_ico" aria-hidden="true"></span></td>'+
                                        '<td><span onclick="downloadFileById(\''+item.doc_id+'\',\''+item.doc_name+
                                        '\')" class="glyphicon glyphicon-save download_ico" aria-hidden="true"></span></td></tr>'
                                });                            
                                $(".flieUpList tbody").html(addStr);                            
                            }else{
                                layer.alert(res.errorInfo);
                            }
                        }
                    });
                }
                
                // 附件上传情况    ,这个方法大概0.05-0.1秒执行一次
                function onprogress(evt){
                    $(".progress_wrap").show();
                    var loaded = evt.loaded;                  //已经上传大小情况 
                    var tot = evt.total;                      //附件总大小 
                    var per = Math.floor(100*loaded/tot);     //已经上传的百分比  
                    
                    if(per==100){
                        layer.msg("上传成功! 正在处理请稍后...",function(){
                            $(".progress_wrap").hide();
                        });                    
                    }
                   $("#porcessBar").html( per +"%" );
                    $("#porcessBar").css("width" , per +"%");
                }
    海纳百川,有容乃大;壁立千仞,无欲则刚。人要有胸怀方能成大事,不要被欲望所驱使,方能风吹不动浪打不摇。 不积跬步无以至千里,不积小流无以成江海。从事技术工作,要时刻学习积累,即使不能一专多能也应术业有专攻,方能以不变应万变。
  • 相关阅读:
    Xcode7 真机调试步骤以及遇到的问题解决办法
    AndroidStudio .gitinore编写
    Android Studio Jar、so、library项目依赖
    Android studio导入eclipse项目混淆打包出错
    spring中ref属性与<ref/>标签
    NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.servlet.view.InternalResourceViewResolver' available
    Maven学习笔记
    Tomcat日志与Log4j日志
    Git笔记
    Tomcat学习
  • 原文地址:https://www.cnblogs.com/websharehome/p/8526336.html
Copyright © 2011-2022 走看看