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

Node.js Lambda上传CSV文件后无法读取form-data的body参数问题

问题原因

你无法直接通过body属性获取文件相关参数,是因为Node.js Lambda接收到的multipart/form-data类型请求为原始未解析的报文字符串/Buffer,不会自动转换为结构化的键值对对象,因此不能直接用body.file、body.filename这类路径访问目标字段。

解决方案

推荐使用轻量的multipart专用解析库处理,无需自己兼容边界场景,操作步骤如下:

  1. 安装依赖
npm install parse-multipart
  1. 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
    };
  }
};
  1. 额外配置提醒
    如果你是通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:45:03