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
相关产品推荐
相关产品推荐

