如何在AWS Lambda(Node.js)中读取Form-Data中的文件
直接从Form-Data读取文件到AWS Lambda(Node.js)
完全可以直接从Form-Data中读取文件,以下是具体实现方案,解决你之前PDF Base64解码损坏的问题:
关键前提:API Gateway配置
要让Lambda能接收Form-Data,需先配置API Gateway:
- 在API Gateway的设置中,将
multipart/form-data添加到「二进制媒体类型」列表。 - 在集成请求的「内容处理」中,设置为
Convert to binary,确保API Gateway将二进制请求体以Base64编码形式传递给Lambda(对应event中的isBase64Encoded为true)。
实现步骤
Node.js原生不支持解析multipart/form-data,需用轻量库busboy处理(适合Lambda环境):
1. 安装依赖
在项目目录执行:
npm install busboy
打包时需将node_modules一起部署到Lambda,或使用Lambda层管理依赖。
2. Lambda处理代码
替换你现有的handler,直接解析Form-Data中的文件:
import Busboy from 'busboy'; export const handler = async (event) => { return new Promise((resolve, reject) => { // 将event.body转换为Buffer(根据是否Base64编码选择解码方式) const bodyBuffer = Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf8'); // 初始化Busboy,传入请求头中的Content-Type const busboy = new Busboy({ headers: { 'content-type': event.headers['Content-Type'] || event.headers['content-type'] } }); let fileBuffer = null; let fileMeta = { name: '', mimeType: '' }; // 监听文件字段 busboy.on('file', (fieldname, fileStream, filename, encoding, mimetype) => { fileMeta.name = filename; fileMeta.mimeType = mimetype; const chunks = []; // 收集文件数据流 fileStream.on('data', (chunk) => chunks.push(chunk)); fileStream.on('end', () => { // 合并为完整Buffer fileBuffer = Buffer.concat(chunks); }); }); // 解析完成后处理结果 busboy.on('finish', () => { if (!fileBuffer) { return resolve({ statusCode: 400, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' }, body: JSON.stringify({ error: '未上传文件' }) }); } // 这里添加你的文件处理逻辑(比如PDF文本提取、格式转换等) // 示例:返回文件基本信息 const response = { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' }, body: JSON.stringify({ fileName: fileMeta.name, mimeType: fileMeta.mimeType, fileSize: `${fileBuffer.length} bytes`, // 若需返回文件内容,转Base64后返回 fileContentBase64: fileBuffer.toString('base64') }) }; resolve(response); }); // 捕获解析错误 busboy.on('error', (err) => { reject({ statusCode: 500, body: JSON.stringify({ error: `解析Form-Data失败:${err.message}` }) }); }); // 启动解析流程 busboy.end(bodyBuffer); }); };
为什么之前PDF解码会损坏?
你之前直接用atob(event.body)的问题在于:
- API Gateway会自动将二进制请求体(如PDF)编码为Base64传递给Lambda,但
atob仅能处理UTF-8编码的Base64字符串,PDF包含的部分字节在UTF-8下无法正确解码,导致文件损坏。 - 使用
busboy直接处理原始Buffer,避免了编码转换中的数据丢失,能完整保留PDF的二进制内容。
内容的提问来源于stack exchange,提问作者Katie Melosto
相关产品推荐
相关产品推荐

