部署在Lambda的API向S3上传文件时文件损坏问题排查
问题描述
我使用React前端将表单数据发送至部署在Lambda上的Python API,该API解析表单数据后提取附件并保存至S3。但无论如何操作,上传至S3的文件均损坏,数据显示异常。
前端React代码
// FRONT END - REACT const formData = new FormData(); formData.append('file', file); formData.append('version', data.version); formData.append('description', data.description); const token = await getStoredUserIdToken(); const restOperation = post({ apiName: 'name', path: API_ENDPOINT_FILE, options: { headers: { Authorization: `Bearer ${token}` }, body: formData } });
后端Python代码
# API - PYTHON uploaded_file = request.files['file'] s3_client.put_object(Bucket="bucket-name", Key="s3-name", Body=uploaded_file, ContentType=content_type, ACL=ACL)
我尝试过使用BytesIO和read()方法,但均无效果,文件始终损坏。请问是否存在我忽略的明显原因?我推测是编码/解码问题,但代码中并未进行相关操作,是否有后台自动处理的环节导致该问题?
回答
1. 检查API Gateway的二进制处理配置(核心原因)
如果Lambda通过API Gateway触发,默认情况下API Gateway会把请求体当作文本解析,自动执行base64编解码,这会直接破坏二进制文件结构。需要做以下调整:
- 进入API Gateway控制台,找到对应API的设置页面,在二进制媒体类型中添加
*/*(或具体的文件类型,如image/png、application/pdf)。 - 在集成请求的内容处理选项中,设置为
CONVERT_TO_BINARY,而非默认的CONVERT_TO_TEXT。
2. 修正后端文件读取逻辑
直接将request.files['file'](FileStorage对象)传给S3的Body参数可能存在问题,需明确读取二进制内容:
uploaded_file = request.files['file'] # 读取完整的二进制内容 file_content = uploaded_file.read() s3_client.put_object( Bucket="bucket-name", Key="s3-name", Body=file_content, ContentType=uploaded_file.content_type, # 使用文件自带的ContentType更准确 ACL=ACL )
3. 避免手动设置前端请求的Content-Type
FormData会自动生成包含boundary的multipart/form-data请求头,不要手动指定该字段。如果你的post方法(看起来类似Amplify API.post)自动添加了错误的Content-Type,会导致表单解析异常,确保headers中不手动设置Content-Type。
4. 检查Lambda的资源配置
若上传文件较大,Lambda内存不足或超时时间过短,可能导致文件读取不完整:
- 调高Lambda内存至1024MB以上
- 将超时时间设置为30秒或更长
内容的提问来源于stack exchange,提问作者suvantorw
相关产品推荐
相关产品推荐

