zoukankan      html  css  js  c++  java
  • js下载文件及命名(兼容多浏览器)

    js文件下载 ; 文件下载方法 ; IE中文件下载的方法 ; 使用IE下载 ; 文件下载兼容性 ; a标签下载 ; 浏览器下载

    函数功能:实现主流浏览器的文件下载功能;

    兼容性: >=IE10,Edge,chrome,firefox;

    与后台的请求方式:GET请求,  url携带参数  url?id=123(隐藏文件真实路径);

    实现下载功能的前提是判断出浏览器类型:

           browserType: function(){
                var userAgent = navigator.userAgent.toLowerCase();
                // Figure out what browser is being used
                var testCenter = {
                    ie:function isIE() { //ie?
                        if (!!window.ActiveXObject || "ActiveXObject" in window)
                            return true;
                        else
                            return false;
                    },
                    edge : ()=>{ return /dge/.test(userAgent) },
                    chrome:()=>{ return /chrome/.test(userAgent)},
                    safari: ()=>{  return /safari/.test(userAgent)&&!(/chrome/.test(userAgent))},
                    opera: ()=>{  return  /opera/.test(userAgent) } ,
                    msie: ()=>{  return /msie/.test(userAgent) && !/opera/.test(userAgent) },
                    mozilla: ()=>{  return /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) }
                };
                var browserObj = {};
                for(var k in testCenter){
                    var result = testCenter[k]();
                    var version = (userAgent.match(/.+(?:rv|it|ra|ie)[/: ]([d.]+)/) || [])[1];
                    if(result){
                        browserObj.browser = k;
                        browserObj.version = version;
                        return browserObj;
                    }
                }
            },
    View Code

    下载函数定义:如下

    dlFile : function(options) {
                var that = this;
                var url = options.url;
                url += "?" + $.param(options.data);   //这里也可以不用jq
                var xhr = new XMLHttpRequest();        //发起请求
                xhr.open('get', url);
                xhr.responseType = 'blob';        //规定响应为流文件
                xhr.send();
                xhr.onreadystatechange = function(){
                    if (this.readyState == 4){
                        if (this.status == '401' || this.status == '402') {
                                         //在这里可以进行一些请求失败的处理
                        }
                        else if(this.status == 200) {
                            var currentBrowserType = that.browserType();  //判断浏览器类型  见上述browserType函数;
                            if(currentBrowserType.browser==='ie'&&(currentBrowserType.version == "10.0" || currentBrowserType.version == "11.0")){   //如果IE创建iframe对象来下载
    
                                var href = window.URL.createObjectURL(this.response);
                                    var elemIF = document.createElement("iframe");
                                    elemIF.src = "http://" + location.host + '/crowd-web/file/downloadFile?' + $.param(options.data);
                                    elemIF.style.display = "none";
                                    document.body.appendChild(elemIF);
                              }else if( currentBrowserType.browser==='edge'){ //如果edge使用h5的a标签的下载功能实现
                                    if (this.getResponseHeader("content-disposition")) {
                                        var fileName = decodeURI(this.getResponseHeader("content-disposition").replace("attachment;filename=", ""));
                                    }
                                var href = "http://" + location.host + '/crowd-web/file/downloadFile?' + $.param(options.data);
                                var $dllink = $('<a href="' + href + '" download="' + fileName + '" ></a>').appendTo(document.body);
                                    $dllink[0].click();
                                     window.URL.revokeObjectURL(href);
                            } else {  //其他现代浏览器采用H5的a标签新特性实现
                                    var href = window.URL.createObjectURL(this.response);
                                    if (this.getResponseHeader("content-disposition")) {
                                        var fileName = decodeURI(this.getResponseHeader("content-disposition").replace("attachment;filename=", ""));
                                    }
                                    var $dllink = $('<a href="' + href + '" download="' + fileName + '" ></a>').appendTo(document.body);
                                 //initMouseEvent已经被放弃,直接使用a标签的dom节点click功能触发点击
                                //var event = document.createEvent("MouseEvents");
                                //event.initMouseEvent(
                                //    "click", true, false, window, 0, 0, 0, 0, 0
                                //    , false, false, false, false, 0, null
                                //);
                                //$dllink[0].dispatchEvent(event);
                                $dllink[0].click();
    
                                window.URL.revokeObjectURL(href); //告诉浏览器可以释放该路径
                            }
                        }
                    }
                };
            },                                                                                                                                        
    View Code

     下载函数调用:如下

    (以上方法均定义在全局对象tools中,也可以写成自己需要的方式)

     tools.dlFile({
                        data : {"fileId":item.id},
                        url :config.URL.downLoad,
                        contentType : "application/json;chartset=utf-8",
                    })
    View Code

     相关知识点:

    文件下载的最佳方法选用:博文

    使用H5 a标签的新特性:博文;

    Blob对象及createObjectURL 和revokeObjectURL方法 : 博文;

    提问:

    a标签模拟click事件: 你猜如下代码能触发页面调转吗?

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
        </head>
        <body>
        <a href="http://www.baidu.com" id="hehe">百度</a>
        <button>跳到百度</button>
        <script src="bower_components/jquery/dist/jquery.js"></script>
        <script>
        $("button").click(function(){
             alert(123)
             $("#hehe").click();
        })
    
        </script>
        </body>
    </html>
    View Code
  • 相关阅读:
    判断两个数组是否相等
    正则表达式的正向预查
    IFC布局特点
    XSS攻击总结
    String与toString
    link与@import
    BFC布局
    单例模式
    <input type="radio" >与<input type="checkbox">值得获取
    Struts标签<s:iterator>遍历访问复杂Map对象
  • 原文地址:https://www.cnblogs.com/wuhaozhou/p/6929394.html
Copyright © 2011-2022 走看看