【发布时间】:2021-12-18 08:10:23
【问题描述】:
我正在尝试从 S3 存储桶中获取我的图像并将其返回。代码如下:
import base64
import boto3
import json
import random
s3 = boto3.client('s3')
def lambda_handler(event, context):
number = random.randint(0,1)
if number == 1:
response = s3.get_object(
Bucket='bucket-name',
Key='image.png',
)
image = response['Body'].read()
return {
'headers': { "Content-Type": "image/png" },
'statusCode': 200,
'body': base64.b64encode(image).decode('utf-8'),
'isBase64Encoded': True
}
else:
return {
'headers': { "Content-type": "text/html" },
'statusCode': 200,
'body': "<h1>This is text</h1>",
}
当我到达终点时,会返回一个小白框的图像。我知道image.png 存在于我的存储桶中,当我使用Web GUI 在浏览器中打开它时,图像已正确加载。我在这里到底做错了什么?万一这很重要,这就是我将图像上传到 S3 的方式(来自另一个 Lambda):
...
# Prepare image for S3
buffer = io.BytesIO()
my_image.save(buffer, 'PNG')
buffer.seek(0) # Rewind pointer back to start
response = s3.put_object(
Bucket=S3_BUCKET_NAME,
Key=f'{S3_KEY}{filename}.png',
Body=buffer,
ContentType='image/png',
)
...
在上面的代码中,my_image 只是我使用PIL 库创建的图像。
感谢您的帮助!
【问题讨论】:
-
图片有多大?请注意,API Gateway 和 AWS Lambda 都有负载大小限制。您的代码似乎是canonical example from AWS,我认为它可以正常工作,所以我怀疑您配置错误,例如Lambda 代理集成。
-
@jarmod 大约 100kb。我可以增加负载大小限制吗?
-
不,它们是硬限制(API Gateway 为 10MB,Lambda iirc 为 6MB)但 100KB,即使是 base64 编码,也可以。如果您需要更大的 URL(上传或下载),您应该使用预签名的 URL。
-
为什么要base64.decode呢?您的上传过程不涉及任何 base64 编码。
-
是的,无论我如何上传图片,它都能正常工作
标签: python amazon-web-services amazon-s3 aws-lambda