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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:27:30