前端使用Blob或者FileReader对象下载后端返回的二进制文件

有时候当后端返回的响应体是二进制时,网关(gateway)会将response进行截断尝试转成json,从而导致下载或者导出的文件有问题一直打不开或者乱码。这种情况请后端解决或者放开一个请求白名单;

当下载或者导出后端返回时二进制文件时,前端可利用Blob或者FileReaderd对象来进行处理下载:

发送请求时responseType设置为'blob'或者'arraybuffer' 例如:

在这里插入图片描述

  1. 使用Bolb:
function downLoadFileByBlob(res){ // 这里res是axios的所有返回结果
	const { data, headers } = res
	const fileType = headers["content-type"]; // 文件类型
	const fileName = decodeURI(headers["content-disposition"]).split(";")[1].split("=")[1]; // 文件名称
	// 创建a标签模拟点击
	const url = window.URL.createObjectURL(new Blob([data],{type:fileType})); // 注意第一个参数是数组形式
    const link = document.createElement('a')
    link.style.display = 'none'
    link.href = url
    link.setAttribute('download', filename)
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
	
}
  1. 使用FileReader对象:
function downLoadByFileReader(res){
  try {
    const blob = new Blob([res.data], {
      type: res.headers["content-type"]
    });
    const filename = decodeURI(res.headers["content-disposition"]).split(";")[1].split("=")[1];
    const reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onload = (e) => {
      const a = document.createElement('a');
      a.download = filename;
      a.href = e.target.result;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    }
  } catch (error) { 
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值