You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJs中如何通过API二进制流下载正常可读的XLSX文件?

解决React中下载XLSX文件损坏的问题

问题核心是请求时未正确处理二进制响应类型,导致接口返回的二进制数据被转成字符串,破坏了文件的原始字节结构。

步骤1:修改请求,指定响应类型

你的请求默认会把响应解析为字符串,需要明确告诉请求库以二进制格式接收数据。如果ApiUtils基于Axios,修改请求如下:

const response = await ApiUtils.get('users?pageSize=0&download=true', {
  responseType: 'blob' // 或 'arraybuffer',二者均可处理二进制文件
});

如果是原生Fetch封装的ApiUtils,则调整为:

const response = await fetch('users?pageSize=0&download=true');
const blobData = await response.blob(); // 直接将响应转为Blob

步骤2:调整下载逻辑

如果响应已经是Blob类型,无需再用new Blob()包裹,直接使用原始Blob生成URL即可:

const handleDownload = () => {
  const url = URL.createObjectURL(response.data); // 若用Fetch则传入blobData
  const link = document.createElement('a');
  link.href = url;
  link.setAttribute('download', 'myExcel.xlsx');
  // 临时添加到DOM避免部分浏览器不支持
  document.body.appendChild(link);
  link.click();
  // 清理资源,避免内存泄漏
  document.body.removeChild(link);
  URL.revokeObjectURL(url);
};

原代码损坏文件的原因

Postman会自动识别响应的Content-Type为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,并以二进制格式保存文件。而你的原请求未指定响应类型,接口返回的二进制字节被转换成UTF-8字符串,部分不可打印字节被替换或丢失,最终生成的Blob已不是原始XLSX文件结构,自然无法打开。

内容的提问来源于stack exchange,提问作者Esha Varma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:00:08