美文网首页
前端下载骚操作

前端下载骚操作

作者: Jiwenjie | 来源:发表于2020-05-27 21:02 被阅读0次

    a 标签

    let a = document.createElement('a');
    a.download = '文件名称';
    a.style.display = 'none';
    a.href = '/static/files/temp.xls';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    

    tips:

    1. 改种方式可以下载本地资源文件,vue项目下文件放在 static 文件夹下,vue3.0放在 public 文件夹下
    2. 如果下载本地文件注意 href 需要写服务器中的文件路径,此处我写的是开发路径
    3. 如果 nginx 中配置过滤,否则默认请求会走后台接口而不是服务器中的本地资源
    4. 不可加鉴权头(一般只有使用 ajax 才能够加鉴权头,否则都不行)
    5. 如果你点击下载是一个文件数组则不可用该方法,浏览器的自我保护机制会使得你只能下载最后一个文件。

    location.href

    location.href = '/pages/export?userId=uij12893901';
    

    tips:

    1. 这种最简单,一般点击导出实现 excel 文件或者下载操作都是使用该方法
    2. 不可加鉴权头

    window.open

    window.open(url,'_self');
    

    tips:

    1. 如果第二个参数穿 _self 则不打开新界面,默认是打开一个新界面
    2. 无法增加请求头
    3. 还有一点需要注意,就是 window.open 在异步成功回掉中使用会失效(这一点大家可以试一下,我听人说的没尝试过)

    iframe

    let iframe = document.createElement('iframe');
    iframe.style.display = 'none';
    iframe.style.height = 0;
    iframe.src = 'http://wasacscas';        // 文件地址
    document.body.appendChild(iframe);
    

    tips:

    1. 这种一般来说是比较完善的请求方式
    2. 可以用来下载多个文件,如果是下载文件数组可以用 iframe 解决,给 iframe 指定 src 就会自动发起请求
    3. 不可加鉴权头

    form表单提交

    $("#downloadform").remove(); 
    var form = $("<form>");//定义一个form表单 
    form.attr("id", "downloadform"); 
    form.attr("style", "display:none"); 
    form.attr("target", ""); 
    form.attr("method", "post"); 
    form.attr("action", path);
    for(var key in params){
        var input1 = $("<input>");
        input1.attr("type", "hidden");
        input1.attr("name", key);
        input1.attr("value", params[key]);
        form.append(input1);
    }
    $("body").append(form);//将表单放置在web中 
    form.submit();//表单提交()
    

    tips: 该方法用的比较少,也是动态下载一个例子

    ajax请求

    还有一种就是使用 ajax 请求,可以增加鉴权头等等
    
    function download() {
        var url = 'download/?filename=aaa.txt';
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);        // 也可以使用POST方式,根据接口
        xhr.responseType = "blob";    // 返回类型blob
        // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
        xhr.onload = function () {
            // 请求完成
            if (this.status === 200) {
                // 返回200
                var blob = this.response;
                var reader = new FileReader();
                reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a表情href
                reader.onload = function (e) {
                    // 转换完成,创建一个a标签用于下载
                    var a = document.createElement('a');
                    a.download = 'data.xlsx';
                    a.href = e.target.result;
                    $("body").append(a);    // 修复firefox中无法触发click
                    a.click();
                    $(a).remove();
                }
            }
        };
        // 发送ajax请求
        xhr.send()
    }
    

    tips:

    1. 这里需要注意的就是后台需要配合处理,返回类型后台需要支持并且后台实际返回格式需要注意(不然很容易出现下载文件乱码)
    2. 可以加鉴权头

    相关文章

      网友评论

          本文标题:前端下载骚操作

          本文链接:https://www.haomeiwen.com/subject/vqwgahtx.html