Node.js Lambda上传CSV文件后无法读取form-data的body参数问题
问题原因
你无法直接通过body属性获取文件相关参数,是因为Node.js Lambda接收到的multipart/form-data类型请求为原始未解析的报文字符串/Buffer,不会自动转换为结构化的键值对对象,因此不能直接用body.file、body.filename这类路径访问目标字段。
解决方案
推荐使用轻量的multipart专用解析库处理,无需自己兼容边界场景,操作步骤如下:
- 安装依赖
npm install parse-multipart
- Lambda 代码示例
const parseMultipart = require('parse-multipart'); exports.handler = async (event) => { try { // 处理base64编码的body:API Gateway默认会把二进制类请求body转成base64 const bodyBuffer = event.isBase64Encoded ? Buffer.from(event.body, 'base64') : Buffer.from(event.body); // 从请求头提取分隔符boundary,兼容header大小写 const contentType = event.headers['Content-Type'] || event.headers['content-type']; const boundary = contentType.split('boundary=')[1]; // 解析form-data所有字段 const parts = parseMultipart(bodyBuffer, boundary); // 提取你上传的文件字段(你Postman里的字段名是file) const uploadFile = parts.find(item => item.name === 'file'); if (!uploadFile) { return { statusCode: 400, body: '未获取到上传的文件' }; } // 你需要的所有参数都可直接提取 const fileName = uploadFile.filename; // 输出:User_Invoice_Details.csv const mimeType = uploadFile.type; // 输出:text/csv const csvContent = uploadFile.data.toString('utf8'); // CSV原始文本内容 // 这里写你后续的业务逻辑:比如存S3、解析CSV入库等 return { statusCode: 200, body: JSON.stringify({ msg: '文件上传成功', fileName, mimeType, fileSize: uploadFile.data.length }) }; } catch (e) { return { statusCode: 500, body: '文件解析失败:' + e.message }; } };
- 额外配置提醒
如果你是通过API Gateway触发Lambda,需要先在API Gateway的二进制媒体类型配置中,添加multipart/form-data类型,否则会出现body编码异常导致解析失败。
不依赖第三方库的简易实现(仅适合单文件上传场景)
如果不想引入依赖,你可以用正则直接从原始body字符串中提取你需要的参数,不兼容复杂场景:
// 提取文件名 const fileName = event.body.match(/filename="([^"]+)"/)[1]; // 提取MIME类型 const mimeType = event.body.match(/Content-Type: ([^\r\n]+)/)[1]; // 提取CSV内容:两个换行之后到下一个boundary之前的内容 const csvContent = event.body.split(/\r\n\r\n/)[1].split(/\r\n----------------------------/)[0];
内容的提问来源于stack exchange,提问作者iam you
相关产品推荐
相关产品推荐

