【问题标题】:Sending image from AWS Lambda function gets corrupted从 AWS Lambda 函数发送图像已损坏
【发布时间】:2021-09-26 02:35:53
【问题描述】:

我在 s3 存储桶中有一张图片,我试图在响应中传递它。我设法这样做了,但文件在途中损坏了。

Lambda 代码:

def get_file(file):
    s3 = boto3.client('s3')
    bucket = 'my_bucket'
    file = s3.get_object(Bucket=bucket, Key=file)['Body'].read()
    encoded_bytes = base64.b64encode(file)
    headers = {
        'Content-Type': 'image/jpeg'
    }
    response = {
        'statusCode': 200,
        'IsBase64Encoded': True,
        'body': json.dumps({'file': base64.b85encode(encoded_bytes).decode('utf-8')}),
        'headers': headers
    }
    return response

再次将其转换为字节并尝试将其保存为图像:

img = str.encode(string)
with open('image.jpeg','wb') as f:
    f.write(img)

从 AWS 发送时我做错了什么?

谢谢!

【问题讨论】:

  • 为什么你不生成一个singed url呢?并在响应中发送url,让客户端直接从s3获取图片
  • 你为什么使用 b85 编码?

标签: python python-3.x amazon-web-services aws-lambda


【解决方案1】:

与其在 Lambda 中下载图片并在响应中发送,不如使用 s3 签名 URL,它允许您生成一个临时签名的 URL,然后您可以将此 URL 发送给客户端,让其直接下载图片来自 s3。

【讨论】:

  • 但要这样做,我需要打开存储桶以供公众访问,对吧?保持关闭感觉更安全,获取数据的唯一方法是从 lambda
  • 不,bucket 仍然是私有的,您只向经过身份验证的客户端发送一个签名的 url,签名的 url 是一个仅用于一个对象的开放 url。
  • Amazon S3 pre-signed URLs 提供对存储在 S3 存储桶中的私有对象的临时访问。您可以使用有权访问该对象的凭据,通过几行代码生成它。这样,应用程序就可以完全控制可以访问哪个对象。
  • 谢谢约翰,我会看看这样做的。在类似 Dropbox 的应用程序中,这会是一个很好的解决方案吗?网址的有效期是多久?
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 2022-08-17
  • 2015-11-14
  • 2020-11-11
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
相关资源
最近更新 更多