下载弹出错误提示

我们大多借助a标签直接下载文件,这样做有一个缺点,如果下载文件报错,无法友好的弹出错误提示

这里提供一个方法,先ajax请求,判断返回是json还是文件流,json弹出错误提示。文件流,进行本地保存,再创建a标签进行下载

这里我用的是基于superagent的前后端请求,其他也类似,只要返回二进制流即可 

/** 导出 */
    private export = async () => {
        const param = {xxx:xxx};
        // responseType('blob') 重点
        const res = await service.send({
            target: this,
            sar: superagent.get(service.domain + '/applyPool/excel/exportList').query({ ...param }).responseType('blob'),
            resFs: [],
        });
        this.DownloadFile(res.res);
        return true;
    }
    private DownloadFile = (res) => {
        const filename = moment(new Date()).format('YYYY-MM-DD') + '-xxxx.xls';
        if (res.body.type !== 'application/json') {
            const blob = res.body; 
            if (typeof window.navigator.msSaveBlob !== 'undefined') {
                window.navigator.msSaveBlob(blob, filename);
            } else {
                let URL = window.URL;
                const downloadUrl = URL.createObjectURL(blob);
                if (filename) {
                    const a = document.createElement("a");
                    if (typeof a.download === 'undefined') {
                        window.location.href = downloadUrl;
                    } else {
                        a.href = downloadUrl;
                        a.download = filename;
                        // document.body.appendChild(a);
                        a.click();
                        // document.body.removeChild(a);
                    }
                } else {
                    window.location.href = downloadUrl;
                }
            }
        } else {
            this.blobToJson(res.body);
        }
    }
    // 将blob数据转变为json
    private blobToJson = (data) => {
        const reader = new FileReader();
        reader.readAsText(data, 'utf-8');
        reader.onload = function (e: any) {
            const result = JSON.parse(reader.result+'');
            if (result.status.description || result.status.message) {
                message.error(result.status.description || result.status.message);
            } else {
                message.error('系统错误');
            }
        };
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值