如何通过AWS API Gateway转发文件至Flask接口?上传文件损坏排查
问题分析与解决方案
核心原因
AWS API Gateway 默认会对 multipart/form-data 类型的请求 payload 做 base64 编码后转发给后端,但你的 Flask 接口需要接收原始二进制文件数据,这种二次编码会导致图片损坏、payload 体积翻倍。
解决步骤
1. 调整集成请求的内容处理策略
- 登录 AWS API Gateway 控制台,找到目标 API 和
/image_upload资源。 - 进入集成请求选项卡,在内容处理区域,将默认的「通过 passthrough 处理」改为「从不通过 passthrough 处理」。
- 删除所有自定义的请求有效载荷转换模板,保持无模板状态。
2. 配置二进制媒体类型(关键操作)
API Gateway 默认仅处理文本类 payload,需配置让它识别并直接转发二进制数据:
- 进入 API 的设置页面,找到二进制媒体类型,添加
multipart/form-data和具体的图片类型(如image/jpeg、image/png),也可直接用*/*覆盖所有类型(建议精准配置)。 - 修改完成后,重新部署 API 到对应阶段(配置变更必须部署才生效)。
3. 验证后端接收数据(可选排查)
如果配置后仍有问题,可在 Flask 接口中添加日志排查:
@app.route("/image_upload", methods=['POST']) def image_upload(): # 打印请求头,确认Content-Type是否正确 print(request.headers.get('Content-Type')) image = request.files['image'] image_data = image.read() # 打印数据长度,对比原始上传的文件大小 print(f"接收的数据长度: {len(image_data)}") base64encoded = base64.b64encode(image_data).decode('utf-8') return base64encoded
4. 检查阶段的内容编码设置
- 进入 API 的部署阶段页面,确认内容编码未启用强制压缩,避免二进制数据被错误压缩篡改。
验证方法
重新部署后再次上传图片,检查返回的 base64 字符串能否正常解码渲染,同时确认 payload 大小与原始文件一致。
内容的提问来源于stack exchange,提问作者Jeff Tian
相关产品推荐
相关产品推荐

