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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:40:18