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

React上传CSV至AWS Node.js Lambda后解析数据问题咨询

解决方案

前置配置检查(API Gateway侧)

先确认你已经在API Gateway完成了以下配置,否则会出现解析异常:

  • 资源的集成请求中开启「使用Lambda代理集成」
  • 二进制媒体类型列表添加 multipart/form-data,确保API Gateway会将这类请求的body以base64编码后传给Lambda

方案1:直接解析multipart表单数据(推荐)

不需要修改前端现有代码,仅在Lambda侧依赖成熟的NPM包完成解析,避免手动处理边界符的问题。

第一步:安装依赖

在Lambda的代码目录安装以下两个包:
parse-multipart:负责解析multipart/form-data格式的原始数据,提取上传的文件内容
csv-parser:负责将CSV文本直接转换为结构化JSON对象

npm install parse-multipart csv-parser

第二步:修改Lambda代码

const parseMultipart = require('parse-multipart');
const csv = require('csv-parser');
const { Readable } = require('stream');

exports.handler = async (event) => {
  try {
    // 1. 从请求头中提取multipart边界符
    const contentType = event.headers['Content-Type'] || event.headers['content-type'];
    const boundary = contentType.split('boundary=')[1];
    
    // 2. 解码base64格式的请求body
    const bodyBuffer = Buffer.from(event.body, 'base64');
    
    // 3. 解析multipart数据,提取上传的CSV文件
    const parts = parseMultipart(bodyBuffer, boundary);
    // 找到你前端append的name为File的文件
    const csvFile = parts.find(part => part.name === 'File');
    if (!csvFile) {
      return {
        statusCode: 400,
        body: JSON.stringify('未找到上传的CSV文件')
      };
    }
    const csvContent = csvFile.data.toString('utf8');
    
    // 4. 解析CSV为JSON数组
    const jsonResult = await parseCsvToJson(csvContent);
    
    // 这里就可以直接用jsonResult操作数据库了
    console.log('解析后的CSV数据:', jsonResult);
    
    return {
      statusCode: 200,
      body: JSON.stringify('数据处理完成')
    };
  } catch (err) {
    console.error('处理失败:', err);
    return {
      statusCode: 500,
      body: JSON.stringify(err.message)
    };
  }
};

// 封装CSV转JSON的工具方法
function parseCsvToJson(csvString) {
  const results = [];
  return new Promise((resolve, reject) => {
    Readable.from(csvString)
      .pipe(csv())
      .on('data', (data) => results.push(data))
      .on('end', () => resolve(results))
      .on('error', (err) => reject(err));
  });
}

方案2:简化传输格式(可选)

如果不想处理multipart解析的逻辑,可以修改前端代码,直接将CSV文件的内容编码后放在JSON请求体中传输:

前端修改示例

const upload = async () => {
  setIsLoadng(true);
  if (selectedFile) {
    // 读取文件内容转为base64
    const reader = new FileReader();
    reader.onload = async (e) => {
      const base64Csv = e.target.result.split(',')[1];
      await axios.post(url, {
        fileName: selectedFile.name,
        csvBase64: base64Csv
      });
      setIsLoadng(false);
    };
    reader.readAsDataURL(selectedFile);
  } else {
    setIsLoadng(false);
    alert("Please choose a file to upload.");
  }
};

Lambda侧直接解码event.body.csvBase64即可得到纯CSV内容,跳过multipart解析步骤。

内容的提问来源于stack exchange,提问作者Brandon0050

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:06:03