【问题标题】:Using Lambda to get image from S3 returns a white box in Python使用 Lambda 从 S3 获取图像在 Python 中返回一个白框
【发布时间】: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


【解决方案1】:

这是我的做法:

您的 lambda 已更正 body:

import base64
import boto3
import json
import random

s3 = boto3.client('s3')

def lambda_handler(event, context):

    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),
        'isBase64Encoded': True
    }

API 网关设置

集成请求

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2020-02-01
    • 2019-12-20
    相关资源
    最近更新 更多