react+axios做导出功能


## 概要

导出文件最简单的就是用window.open(),或者用window.loaction方法,但是此方法不能做token认证,开发中实际过程中需要传token,此时我们就不能用widow方法来创建连接。

​

export function downLoad(URI: string) {
    service.get(URI, { responseType: 'blob' }).then((res: any) => {
        const { data } = res
        if (res.status == 200) {
            let blob = new Blob([data], { type: "application/json" });
            if (res.headers['filename'] == undefined) {
                // 若下载成功后端将文件名filename字段放在headers里面,失败则无此字段
                //将blob格式的响应数据转换为原本的格式,方便判断接口是否返回报错信息
                blobToJsonFile(blob)
            } else {
                let fileName = decodeURIComponent(res.headers['filename'])
                const elink = document.createElement('a')
                elink.download = fileName
                elink.style.display = 'none'
                elink.href = URL.createObjectURL(blob)
                document.body.appendChild(elink)
                elink.click()
                URL.revokeObjectURL(elink.href)
                document.body.removeChild(elink)
            }

        }
    })
}

​

后端是将文件名称放在请求头里,正常导出的返回结果如下

由于自己业务端需要判断有些数据导出是需要拿到后端的返回的错误信息在页面上进行提示,后端结果如下:

问题来了,在发送请求的时候我们规定响应的文件是blob形式,后端人员无法在blob文件里给我们错错误信息提示,所以当我们下载不成功时候,需要将blob文件转换为json格式即: blobToJsonFile(blob)方法

function blobToJsonFile(blob: any) {
    let reader: any = new FileReader();
    reader.onloadend = function () {
        let jsonData = JSON.parse(reader.result);
        if (jsonData.code !== 0) {
            message.error(jsonData.msg)
        }
    };
    reader.readAsText(blob);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值