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

TypeScript内存创建Zip文件存入AWS S3后无法读取问题求助

问题排查与修复方案

嘿,我看了你的代码,问题其实出在存储到S3的那一步——你把二进制的Zip Buffer转成了binary字符串,这直接破坏了Zip文件的结构,导致下载后无法正常读取。

为啥会出问题?

Zip文件是纯二进制格式的,当你调用zipData.toString('binary')时,Node.js会把Buffer转换成Latin-1编码的字符串。虽然这个编码理论上能映射每个字节,但在后续传递给S3的过程中,很可能因为隐含的编码转换(比如S3默认处理逻辑或你的存储服务内部的字符串处理)导致字节错乱,最终生成的文件就损坏了。

怎么修复?

直接把Buffer类型的zipData传给你的存储服务,别做任何字符串转换!修改后的代码如下:

const zip = new AdmZip();
zip.addFile('tmp.txt', Buffer.from(data, 'utf-8'));
const zipData = await zip.toBufferPromise();
try {
  const now = dayjs().format('YYYYMMDDTHHmmss');
  const fileName = `Feedback-${now}.zip`; // 记得加上.zip后缀,方便系统识别
  await this._storageService.saveFile(zipData, 'sprintFeedback', fileName);
} catch (err) {
  // 建议加上错误捕获,方便后续排查问题
  console.error('存储Zip文件到S3失败:', err);
  throw err;
}

额外提醒

  • 给文件名加上.zip后缀:原来的文件名没有后缀,下载后系统可能没法识别这是个Zip文件,加上后缀能避免这类小问题。
  • 确认你的saveFile方法支持Buffer参数:如果这个方法之前只处理字符串,得调整它的实现,比如在调用AWS SDK的putObject时,把Body参数直接设为传入的Buffer,而不是转成字符串。

内容的提问来源于stack exchange,提问作者Guy Hagemans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:37:41