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

基于SAM部署的Serverless Flask API处理multipart/form-data时崩溃问题求解

问题成因

该报错的核心原因是使用的flask-lambda版本未适配API网关的二进制请求体处理逻辑:

  • 你配置的BinaryMediaTypes已经生效,API网关(包括sam local模拟环境)收到multipart/form-data类型的请求时,会将二进制请求体编码为base64格式的字符串,同时在事件参数中标记isBase64Encoded: True
  • 官方原版的flask-lambda早已停止维护,没有针对isBase64Encoded字段做特殊处理,直接将字符串类型的base64编码内容传给了Werkzeug的表单解析器
  • Werkzeug的multipart解析器预期接收字节流作为输入,拿到字符串后执行操作时触发类型错误,即你看到的TypeError: 'str' object cannot be interpreted as an integer报错
解决方案

可任选以下两种方案修复:

方案1:更换社区维护的兼容版本flask-lambda

官方原版flask-lambda不支持Python3.7以上版本的新特性,也不兼容API网关的二进制处理逻辑,可直接替换为社区维护的兼容版本flask-lambda-python39:

  1. 卸载原有依赖:pip uninstall flask-lambda
  2. 安装新依赖:pip install flask-lambda-python39
  3. 原有业务代码无需修改,该版本已内置base64请求体自动解码逻辑,可直接正常解析form-data格式的参数和上传文件

方案2:手动添加base64解码逻辑

如果不想更换依赖包,可自行继承重写FlaskLambda的请求处理方法,在请求进入路由前完成base64解码:

from flask import request, jsonify
from flask_lambda import FlaskLambda
import base64

class Base64AwareFlaskLambda(FlaskLambda):
    def __call__(self, event, context):
        # 解码base64格式的二进制请求体
        if event.get('isBase64Encoded', False):
            event['body'] = base64.b64decode(event['body'])
        return super().__call__(event, context)

app = Base64AwareFlaskLambda(__name__)

@app.route('/kits', methods=['POST'])
def lambda_handler():
    print(request.form['title'])
    print(request.form['description'])
    print(request.form['kitType'])
    # 也可正常获取上传的文件
    # files = request.files.getlist('your_file_field')
    return jsonify("success"), 201
可选校验项

如果修改后仍有报错,可检查以下配置:

  • 确认template.yaml中的BinaryMediaTypes配置已正确部署,sam本地测试时可打印event参数的isBase64Encoded字段,确认值为True
  • 确认Postman调用时未手动修改Content-Type请求头,不要自行添加boundary参数,让Postman自动生成即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:42:01