axios请求设置responseType为‘blob‘或‘arraybuffer‘下载文件时,正确处理返回值为文件流或json对象的情况

前言
使用axios请求api下载导出一个文件时,接口返回值可能会出现两种情况:

1、文件流

2、json对象

responseType值的类型

数据类型
''DOMString(默认类型)
arraybufferArrayBuffer对象
blobBlob对象
documentDocumnet对象
jsonJavaScript object, parsed from a JSON string returned by the server
textDOMString

 实例
返回值不同情况的处理方式,举例如下:

①、请求设置为 responseType: 'arraybuffer',
请求成功时,后端返回文件流,正常导出文件;
请求失败时,后端返回json对象,如:{"Status":"false","StatusCode":"500","Result":"操作失败"},也被转成了arraybuffer

此时请求成功和失败返回的http状态码都是200

解决方案:将已转为arraybuffer类型的数据转回Json对象,然后进行判断
 

async downloadFile (file) {
let res = await this.$axios.post(this.API.order.tradeImpExcle, { responseType: "arraybuffer" });
if (!res) return;
try {
    //如果JSON.parse(enc.decode(new Uint8Array(res.data)))不报错,说明后台返回的是json对                
    象,则弹框提示
    //如果JSON.parse(enc.decode(new Uint8Array(res.data)))报错,说明返回的是文件流,进入 
   catch,下载文件
   let enc = new TextDecoder('utf-8')
   res = JSON.parse(enc.decode(new Uint8Array(res.data))) //转化成json对象
   if (res.Status == "true") {
      this.refresh()
      this.$message.success(res.Msg)
   } else {
     this.$message.error(res.Result)
   }
} catch (err) {
    const content = res.data;
    const blob = new Blob([content]);
    let url = window.URL.createObjectURL(blob);
    let link = document.createElement("a");
    link.style.display = "none";
    link.href = url;
    link.setAttribute(
    "download",
    res.headers["content-disposition"].split("=")[1]
    );
    document.body.appendChild(link);
    link.click();
}
}

try {

            // 因为请求设置为 responseType: 'arraybuffer',所以在接口不满足下载是要对返回错误信息 进行 转码处理为 对象

            // 如果JSON.parse(enc.decode(new Uint8Array(res.data))) 不报错 后台返回的JSON对象,做弹窗提示

            // 如果JSON.parse(enc.decode(new Uint8Array(res.data))) 报错 后台返回的是文件流,做文件下载

            let enc = new TextDecoder('utf-8')

            let newres = JSON.parse(enc.decode(new Uint8Array(res.data)))

            if(!newres.result.success){

              this.$message.error(newres.result.msg)

            }

          } catch (error) {

            const fileNameCode = res.headers['content-disposition'].split('filename=')[1]

            const fileName = decodeURIComponent(escape(fileNameCode))

            let pdfUrl = window.URL.createObjectURL(

            new Blob([res.data], { type: "application/msdoc;charset=UTF-8" })

          );

          var a = document.createElement("a");

          document.body.appendChild(a);

          a.style = "display: none";

          a.href = pdfUrl;

          a.download = fileName;

          a.click();

          document.body.removeChild(a);

          }

 

②、请求设置为 responseType: 'blob',

解决方案:将已转为blob类型的数据转回Json对象,然后进行判断

代码如下

async downloadFile (file) {
let formData = new FormData();
formData.append("allTradesExcelFile", file);
let res = await this.$axios.post(this.API.order.tradeImpExcle, formData, { responseType: "blob" });
if (!res) return;
let r = new FileReader()
let _this = this
r.onload = function () {
try {
// 如果JSON.parse(this.result)不报错,说明this.result是json对象,则弹框提示
// 如果JSON.parse(this.result)报错,说明返回的是文件流,进入catch,下载文件
res = JSON.parse(this.result)
if (res.Status == "true") {
_this.refresh()
_this.$message.success(res.Msg)
} else {
_this.$message.error(res.Result)
}
} catch (err) {
const content = res.data;
const blob = new Blob([content]);
let url = window.URL.createObjectURL(blob);
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute(
"download",
res.headers["content-disposition"].split("=")[1]
);
document.body.appendChild(link);
link.click();
}
}
r.readAsText(res.data) // FileReader的API
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值