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

AWS Lambda与API网关解析文件后转multipart/formdata转发失败问题

AWS Lambda转发multipart文件至第三方服务器失败问题

场景说明

我基于AWS Lambda和API网关搭建了一个支持文件上传的REST API,核心需求是:接收客户端上传的多文件(multipart/form-data格式),解析后将每个文件单独以multipart/form-data形式转发到另一台目标服务器。

通过Postman上传两张图片后,Lambda日志中捕获的event.body是如下multipart格式字符串:

----------------------------269453880547064499146449
Content-Disposition: form-data; name="file"; filename="smiling.png"
Content-Type: image/png

�PNG


IHDR��asBIT|d�^IDAT8���=KBa��IB����"�-P\�6!Bz�D�c�hk�K�hAV`Km���K�PKm��Oý�R�-�O��<�#ZkzT���4B��nMȑ0����@#�A�- ����7w��"�fY��J�C�)�Z`D3�a��E�h���<F�7w����d�ɉ7���Y�?f�+Y�&9�B����P����`%�d:�T
�m�h�K�`����zT;�e �mc�$=A�q���&@Y��4O=W����P@�T���*��V�t`a��H�UD��6��Һ���W[��,  ��u�Ea�.c�-��S�z���Q�`���S�~y��xݡ�O�]IEND�B`�
----------------------------269453880547064499146449
Content-Disposition: form-data; name="file"; filename="smiling.png"
Content-Type: image/png

�PNG


IHDR��asBIT|d�^IDAT8���=KBa��IB����"�-P\�6!Bz�D�c�hk�K�hAV`Km���K�PKm��Oý�R�-�O��<�#ZkzT���4B��nMȑ0����@#�A�- ����7w��"�fY��J�C�)�Z`D3�a��E�h���<F�7w����d�ɉ7���Y�?f�+Y�&9�B����P����`%�d:�T
�m�h�K�`����zT;�e �mc�$=A�q���&@Y��4O=W����P@�T���*��V�t`a��H�UD��6��Һ���W[��,  ��u�Ea�.c�-��S�z���Q�`���S�~y��xݡ�O�]IEND�B`�
----------------------------269453880547064499146449--

我使用lambda-multipart-parser库解析这个body,代码如下:

import parser from 'lambda-multipart-parser'

// ...其他逻辑

const result = await parser.parse(event)

解析后的每个文件结构为:

{
    filename: string
    content: Buffer
    contentType: string
    encoding: string
    fieldname: string
}

已尝试的失败方法

方法1:按边界分割原始body后拼接

尝试用正则分割event.body获取单个文件内容,再添加到FormData:

const splitFileBody = event.body?.split(fileBoundary)

// 仅尝试发送单个文件
formData.append('file', splitFileBody[0])

结果:目标服务器返回400状态码,错误信息:body of your POST request is not well-formed multipart/form-data

方法2:创建浏览器端File对象

尝试在Lambda中创建File对象:

const fileC = new File([file.content], file.fieldname, { type: file.contentType, lastModified: Number(new Date()) })
console.log('fileC', fileC)
const formData = new FormData()
formData.append('file', fileC)

结果:Lambda日志报错:File is not defined

方法3:直接传入解析后的Buffer到FormData

将解析得到的文件Buffer直接添加到FormData:

form.append('file', file.content, {
    filename: file.filename,
    contentType: file.contentType
});

结果:目标服务器返回400状态码,错误信息:body of your POST request is not well-formed multipart/form-data

补充信息

  • 由于Lambda运行环境中没有原生FormData,我使用了form-data第三方包:
import FormData from 'form-data'

// ...
formData.append('file', file.content, {
    filename: file.filename
})
  • 使用axios发送POST请求的代码:
const res = await axios.post(URL, formData, {
    headers: {
        ...formData.getHeaders(),
        'content-length': file.content.length
    }
})

提问

我的这些方法是否正确?如果不正确该如何调整?如果方法可行,哪种更优,且如何避免错误?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:21:01