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

如何用Python Requests向AWS发送multipart/form-data格式TSV文件?问题排查

Python Requests发送multipart/form-data到AWS的异常排查

问题现象

  • VSCode运行Python代码时,请求根本没到AWS Gateway,网关查不到任何日志
  • Postman按相同配置发请求,能到Gateway,但返回"message": "Unsupported Media Type"错误,关联的Lambda也没日志

相关配置

Python代码

def main():
    file_path = 'files/data.tsv'
    file_name = os.path.basename(file_path)
    multipart_data = MultipartEncoder(
        fields={
            'file': (file_name, open(file_path, 'rb'), 'text/tab-separated-values')
        }
    )

    headers = {
        'Content-Type': multipart_data.content_type,
        'Singnature': SECRET_KEY
    }

    try:
        r = requests.post(ENDPOINT, headers=headers, data=multipart_data)
    except Exception as e:
        print(e)

Postman配置

  • URL、请求头和Python代码完全一致
  • 请求体用form-data格式,key设为file,value选本地的data.tsv文件

AWS配置

  • API Gateway的Binary media types已经设为multipart/form-data

API Gateway集成请求模板

{
  "headers": {
#foreach( $name in $input.params().header.keySet() )
    "$name" : "$util.escapeJavaScript( $input.params().header.get( $name ) )"
  #if($foreach.hasNext),#end
#end
  },
  "body": "$util.escapeJavaScript( $input.body ).replaceAll(\"\\'\",\"'\")"
}

可能的问题原因

1. Python代码请求未到网关的原因

  • ENDPOINT配置错误:检查ENDPOINT变量是不是API Gateway的完整地址(比如https://xxx.execute-api.region.amazonaws.com/stage),有没有拼写错误,或者环境变量未正确加载
  • 网络拦截:本地代理、防火墙、VPN可能挡住了请求,试试用curl直接调用端点测试连通性
  • 异常捕获不完整:代码只打印异常,但未输出响应状态码、内容等信息,可能请求发出去了但遇到DNS解析失败、SSL错误等问题,在try块里加print(r.status_code, r.text)(如果请求能发送成功),或者把异常信息打印完整
  • 依赖缺失:MultipartEncoder来自requests-toolbelt库,未安装的话代码可能静默失败,确认是否已安装该库

2. Postman返回"Unsupported Media Type"的原因

  • Gateway媒体类型匹配问题:虽然设了multipart/form-data为二进制类型,但Postman发送的Content-Type是带边界的完整格式(比如multipart/form-data; boundary=----WebKitFormBoundaryxxx),Gateway可能未识别到这种带边界的格式,需确认集成请求是否针对完整的Content-Type配置了模板,而非仅multipart/form-data
  • 集成模板不适配二进制数据:当前模板是为JSON或文本类型设计的,multipart/form-data作为二进制数据,$input.body会被编码为base64,直接用$util.escapeJavaScript处理会导致格式错误,需更换为适配二进制的模板,比如将body转为base64:
    {
      "headers": {
    #foreach( $name in $input.params().header.keySet() )
        "$name" : "$util.escapeJavaScript( $input.params().header.get( $name ) )"
      #if($foreach.hasNext),#end
    #end
      },
      "body": "$util.base64Encode($input.body)"
    }
    
  • Gateway阶段配置未生效:检查部署的阶段是否启用了二进制支持,阶段里的"Binary Media Types"需与控制台配置一致,且修改后需重新部署才会生效
  • Lambda集成配置错误:如果是HTTP集成到Lambda,需确认触发器的路径、HTTP方法是否正确,Lambda是否能处理multipart/form-data格式的输入,Gateway是否正确将请求转发到Lambda

内容的提问来源于stack exchange,提问作者上嶋光優

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:30:55