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
相关产品推荐
相关产品推荐

