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

