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

Node.js使用Axios读取S3 URL后无法生成可读格式Excel文件求助

代码问题分析与修复方案

核心问题点

  • responseType 选型错误:Node.js 环境中不存在浏览器专属的 Blob 对象,设置 responseType: 'blob' 会让 Axios 在 Node.js 下生成不兼容的响应数据对象,写入文件后必然导致 Excel 损坏。应改用 arraybuffer 或 stream 类型。
  • 未正确完成文件写入:仅调用 ostream.write(response.data) 后没有关闭流,部分数据可能还在缓冲区未写入磁盘,导致文件不完整,Excel 无法识别。
  • 手动写入流的可靠性不足:直接调用 write 不如使用流的 pipe 方法稳定,pipe 会自动处理背压、流结束和错误事件,避免数据丢失。

修复后的代码示例

方案一:使用 arraybuffer 类型(适合小文件)

const axios = require('axios');
const fs = require('fs');

axios({
  url: 'https://example.com/1666960010753_Me%20Data.xlsx',
  method: 'GET',
  responseType: 'arraybuffer',
}).then((response) => {
  const ostream = fs.createWriteStream(`./${filename}`);
  ostream.write(response.data);
  ostream.end(); // 必须调用 end() 关闭流,确保所有数据写入磁盘

  // 监听错误与完成事件,排查问题
  ostream.on('error', (err) => {
    console.error('文件写入失败:', err);
  });

  ostream.on('finish', () => {
    console.log('文件写入完成');
  });
}).catch((err) => {
  console.error('请求S3文件失败:', err);
});

方案二:使用 stream 类型(适合大文件,更高效)

const axios = require('axios');
const fs = require('fs');

axios({
  url: 'https://example.com/1666960010753_Me%20Data.xlsx',
  method: 'GET',
  responseType: 'stream',
}).then((response) => {
  const ostream = fs.createWriteStream(`./${filename}`);

  // 用 pipe 自动处理流的传输与结束
  response.data.pipe(ostream);

  ostream.on('error', (err) => {
    console.error('文件写入失败:', err);
  });

  ostream.on('finish', () => {
    console.log('文件写入完成');
  });
}).catch((err) => {
  console.error('请求S3文件失败:', err);
});

内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:20:22