如何在AWS TypeScript Lambda中通过API Gateway返回Zip文件
解决AWS TypeScript Lambda返回本地Zip文件的问题
核心问题出在二进制文件的读取逻辑和API Gateway的响应格式要求上:用utf8编码读取zip这类二进制文件会破坏原始数据,同时API Gateway需要明确识别二进制响应的编码类型。以下是可行的解决方案:
正确实现代码
import * as fs from 'fs'; import * as path from 'path'; exports.handler = async function (event: any) { // 读取本地zip文件,不指定编码直接获取Buffer(二进制原始数据) const zipBuffer = fs.readFileSync(path.join(__dirname, 'filename.zip')); // 将Buffer转为base64字符串,适配API Gateway的响应要求 const zipBase64 = zipBuffer.toString('base64'); return { statusCode: 200, headers: { "Content-Type": "application/zip", // 注意修正拼写:是Content-Disposition,不是Dispostion "Content-Disposition": "attachment; filename=filename.zip" }, // 必须设置该字段,告诉API Gateway body是base64编码的二进制数据 isBase64Encoded: true, body: zipBase64 }; };
关键细节说明
- 避免用utf8读取二进制文件:zip是纯二进制格式,utf8编码会将非文本兼容的字节转换为乱码字符,直接导致文件损坏。读取时不指定编码,获取原始Buffer才是正确方式。
- 必须开启isBase64Encoded:API Gateway默认把响应body当作文本处理,只有设置该字段为
true,才会自动将base64字符串解码为原始二进制数据返回给客户端。 - 确认文件部署路径:部署Lambda时要确保
filename.zip被包含在部署包中,用path.join(__dirname, 'filename.zip')可以避免因Lambda执行目录差异导致的文件找不到问题。 - 修正响应头拼写:你之前的
Content-Dispostion是拼写错误,正确字段名是Content-Disposition,否则浏览器可能无法识别为下载附件。
为什么之前的尝试无效?
- JSZip这类工具更适合动态生成zip文件,读取本地已有zip时额外依赖反而增加复杂度,直接处理原始Buffer更高效。
- 直接返回字节缓冲区或未编码的二进制数据,会被API Gateway当作文本解析,导致数据被错误转换。
内容的提问来源于stack exchange,提问作者Antônio
相关产品推荐
相关产品推荐

