vue axios ts 封装流文件下载方法

vue axios ts 封装流文件下载方法

// 定义文件下载的接口
interface DOWNFILETYPE {
    url: string; //请求地址
    method: string; //请求方式
    params: object; //请求参数
    filename?: string; //文件名称
    type: string; //文件类型
}

文件下载方法实现

function downloadFile(options: DOWNFILETYPE): any {
    const { url, method, params, filename, type } = options;
    let config = {
        url: url,
        baseURL: baseURL.baseURL,
        method: method,
        responseType: "blob",
        headers: {
            "X-Access-Token": getStore("token") ? getStore("token") : "",
        },
    };
    if (method == "get") {
        config["params"] = params;
    } else {
        config["data"] = params;
    }

    axios(config).then((response) => {
        let data = response.data;
        // 请求失败,后台返回json
        if (data && data.type && data.type.includes("application/json")) {
            let reader = new FileReader();
            reader.onload = function (event) {
                let result: any = reader.result;
                let message = JSON.parse(result).message;
                //错误处理
                (Message as any).closeAll();
                Message.error(message || "");
            };
            reader.readAsText(data);
            return true;
        }
        //请求成功,下载文件
        const content: any = data;
        const blob = new Blob([content], { type: "application/octet-stream" });
        let file_name = filename ? filename + type : response.headers["content-disposition"] ?
            decodeURIComponent(response.headers["content-disposition"].split("filename=")[1]) :
            "导出文件" + type
            
        if ("download" in document.createElement("a")) {
            // 非IE下载
            const elink = document.createElement("a");
            elink.download = file_name;
            elink.style.display = "none";
            elink.href = window.URL.createObjectURL(blob);
            document.body.appendChild(elink);
            elink.click();
            URL.revokeObjectURL(elink.href);
            document.body.removeChild(elink);
        } else {
            // IE10+下载
            navigator.msSaveBlob(blob, file_name);
        }
    });
}

需要注意的点:
axios拦截器对返回流类型的设置

axios.interceptors.response.use(
    function(response) {
        console.log("Response", response)
        if (response.status == 200) {
            let responseData = response.data
            if (response.config.responseType == "blob") {
                return response;
            }
            return responseData
        } else {
            return {}
        }
    },
    function(error) {}
)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值