Python通过Lambda获取S3存储桶图片返回小白框问题求助
问题排查与解决方法
常见问题点
- S3对象Key不匹配
你上传代码中S3对象的Key是带S3_KEY前缀的拼接格式:f'{S3_KEY}{filename}.png',但读取代码里硬编码的Key是image.png,如果S3_KEY不为空、或者上传时filename参数不是image,就会导致读取的对象和你控制台确认的图片不是同一个,读取到空对象或者不相关内容转码后就会显示为极小的白色方框。
可以在S3控制台找到对应图片,复制对象的完整键(包含所有前缀),替换读取代码中的Key值。 - API网关二进制配置缺失
如果你是通过AWS API网关触发Lambda,需要在网关配置中添加image/png到二进制媒体类型列表,否则API网关会把你返回的base64编码图片当作文本转码,导致图片内容损坏。- REST API:在API设置的「二进制媒体类型」板块添加
image/png,重新部署API后生效 - HTTP API:在API设置的「内容处理」中开启二进制自动转换,或手动添加
image/png为二进制类型
- REST API:在API设置的「二进制媒体类型」板块添加
- 缺少错误处理导致异常静默
现有代码没有捕获S3读取的异常,如果因为Lambda执行角色缺少s3:GetObject权限、Bucket名称填错等问题导致读取失败,会直接返回错误响应,编码后也会显示为损坏的图片。
修复后的参考代码
import base64 import boto3 import random import logging logger = logging.getLogger() logger.setLevel(logging.INFO) s3 = boto3.client('s3') # 替换为S3控制台中对应图片的完整Key、桶名 IMAGE_KEY = "image.png" BUCKET_NAME = "bucket-name" def lambda_handler(event, context): number = random.randint(0,1) logger.info(f"随机分支值: {number}") if number == 1: try: response = s3.get_object( Bucket=BUCKET_NAME, Key=IMAGE_KEY, ) # 日志打印读取的对象大小,和S3控制台的图片大小对比确认是否读取正确 logger.info(f"S3对象大小: {response['ContentLength']}") image = response['Body'].read() return { 'headers': { "Content-Type": "image/png" }, 'statusCode': 200, 'body': base64.b64encode(image).decode('utf-8'), 'isBase64Encoded': True } except Exception as e: logger.error(f"读取图片失败: {str(e)}") return { 'headers': { "Content-type": "text/html" }, 'statusCode': 500, 'body': f"<h1>读取失败: {str(e)}</h1>", } else: return { 'headers': { "Content-type": "text/html" }, 'statusCode': 200, 'body': "<h1>This is text</h1>", }
内容的提问来源于stack exchange,提问作者darkhorse
相关产品推荐
相关产品推荐

