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

AWS API Gateway+Lambda上传JSON转长字符串问题求助

问题排查与解决方案

问题根源

API Gateway接收到application/octet-stream类型的二进制数据时,会自动将其Base64编码后传递给Lambda函数,而你的代码直接将编码后的字符串存入S3,导致文件内容异常。同时,OpenAPI配置中的冗余设置也干扰了二进制数据的处理逻辑。

具体修复步骤

1. 配置API Gateway二进制媒体类型

在OpenAPI配置的根节点添加二进制媒体类型声明,确保API Gateway正确识别并处理二进制数据:

x-amazon-apigateway-binary-media-types:
  - application/octet-stream

2. 修改Lambda函数解码Base64数据

在Lambda中先对Base64编码的body进行解码,再写入S3:

import boto3
import base64

BUCKET = "你的S3桶名称"

def lambda_handler(event, context):
    # 处理Base64编码的二进制数据
    decoded_content = base64.b64decode(event["body"]) if event.get("isBase64Encoded") else event["body"].encode('utf-8')
    
    s3_client = boto3.client('s3')
    s3_client.put_object(
        Body=decoded_content,
        Bucket=BUCKET,
        Key=event['pathParameters']['filename']
    )

    return {
        'statusCode': 200,
        'body': '文件上传成功'
    }

3. 简化API Gateway集成配置

由于使用aws_proxy集成类型,requestTemplates和passthroughBehavior设置无效,可移除以简化配置:

x-amazon-apigateway-integration:
  httpMethod: POST
  uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${MyLambda}/invocations
  requestParameters:
    integration.request.path.filename: method.request.path.filename
  type: "aws_proxy"

4. 验证请求

保持原curl命令不变,重新部署API Gateway和Lambda后测试:

curl --location 'https://[API_ID].execute-api.us-east-1.amazonaws.com/v1/mappings/data.json' \
--header 'Content-Type: application/octet-stream' \
--data '@./data.json'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:17:48