API Gateway配置求助:如何让Lambda接收图片与查询参数
解决API Gateway传递图片+元数据到Lambda的映射问题
我来帮你搞定这个配置!你已经走对了第一步,现在只需要调整映射模板,把查询参数和图片内容一起打包传给Lambda就行,下面是具体步骤:
1. 更新API Gateway集成请求的映射模板
你之前只映射了图片内容,现在要把查询参数(客户ID、手机号这些)也加进去。打开API Gateway对应POST方法的集成请求,找到映射模板,修改现有的application/png模板为:
{ "imageContent": "$input.body", "metadata": { "customerId": "$input.params('customerId')", "phoneNumber": "$input.params('phoneNumber')" } }
说明:
$input.body:保留你原来的图片二进制内容(API Gateway会自动把二进制数据转成Base64字符串传给Lambda,后面Lambda要解码)$input.params('参数名'):通过这个语法获取URL上的查询参数,比如用户调用API时用https://your-api-endpoint?customerId=1001&phoneNumber=138xxxxxxx,就能拿到对应的参数值- 如果你的元数据是放在请求头里的,把
$input.params('参数名')换成$input.params('header参数名'),比如$input.params('X-Customer-ID')
2. 确保API Gateway启用二进制媒体类型
为了保证图片不被损坏,一定要在API Gateway的设置里,把application/png添加到二进制媒体类型列表中。这样API Gateway会以原始二进制格式处理图片,而不是转成文本。
3. Lambda函数的处理代码示例(Python)
Lambda收到的event会包含你映射的imageContent和metadata,下面是处理上传S3和写入DynamoDB的示例代码:
import boto3 import base64 from datetime import datetime # 初始化客户端 s3_client = boto3.client('s3') dynamodb_table = boto3.resource('dynamodb').Table('你的DynamoDB表名') def lambda_handler(event, context): try: # 解析元数据 metadata = event['metadata'] customer_id = metadata['customerId'] phone_number = metadata['phoneNumber'] # 解码图片内容(API Gateway传过来的是Base64字符串) image_data = base64.b64decode(event['imageContent']) # 上传到S3:生成唯一的文件名,避免重复 s3_key = f"user_images/{customer_id}/{datetime.now().strftime('%Y%m%d%H%M%S')}.png" s3_client.put_object( Bucket='你的S3桶名', Key=s3_key, Body=image_data, ContentType='image/png' ) # 写入DynamoDB元数据 dynamodb_table.put_item( Item={ 'customerId': customer_id, 'phoneNumber': phone_number, 's3ImageKey': s3_key, 'uploadTime': datetime.now().isoformat() } ) return { 'statusCode': 200, 'body': '图片上传和元数据存储成功!' } except Exception as e: return { 'statusCode': 500, 'body': f'出错了:{str(e)}' }
4. 关键注意事项
- IAM权限:给Lambda角色添加S3的
PutObject权限和DynamoDB的PutItem权限,否则会报错 - 参数名一致性:映射模板里的参数名要和用户调用API时的查询参数名完全一致(大小写敏感)
- 二进制大小限制:API Gateway默认的请求大小限制是10MB,如果你的图片更大,需要在API Gateway设置里调整
payload size
这样配置后,用户调用API时携带图片(POST body)和查询参数,API Gateway就会把两者都传递给Lambda,完成后续的S3上传和DynamoDB存储啦!
内容的提问来源于stack exchange,提问作者vyom kumar
相关产品推荐
相关产品推荐

