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
相关产品推荐
相关产品推荐

