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

部署在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:57:10