python - 尝试从 s3 获取图像并打开图像时出现 OSError : cannot identify image file <_io. BytesIO 对象位于 0x00000198001B9E08>

标签 python amazon-s3 aws-lambda

我正在尝试获取 jpeg。来自 s3 存储桶,但我收到错误。这是部分代码:

s3_client = boto3.client('s3')
bucket = os.environ['encryption_bucket']

def encrypt_zip(event, contex):
    image_key = event['keys']
    response = s3_client.get_object(Bucket= bucket, Key=image_key)
    if response['ResponseMetadata']['HTTPStatusCode'] == 200:
        object_data = response['Body']._raw_stream.data
        print(type(object_data))
        image = Image.open(io.BytesIO(object_data))

错误:

OSError: cannot identify image file <_io.BytesIO object at 0x00000198001B9E08>

第二个问题:尝试从 s3 存储桶下载对象并保存该图像

if 's3' in event['Records'][0]:
    s3  = event['Records'][0]['s3']
    image_key  = s3['object']['key']
    key_split = str(image_key).split('/')
    job_key = "-".join(key_split)
    bucket = s3['bucket']['name']
    with open(job_key, 'wb') as data:
         client.download_fileobj(bucket, image_key, data)
         set_log("logo image loaded successfully....", False)
    image_path = '/tmp/' + job_key
    image = Image.open(job_key)
    image.save(image_path)

ERROR : OSError: cannot identify image file '8093-C8FE-2403-490B-9050e99b-53a9-4e2f-b9af-9910d5fc9a0f.jpg'

以及本地下载的图片。它无法加载。 enter image description here

最佳答案

根据您的其他问题(已删除?),您的要求是:

  • 文件名数组被传递到函数中
  • / 转换为 - 以简化文件名
  • 您希望使用这些文件创建一个 zip 文件

因此,它会是这样的:

import boto3
import zipfile

s3_client = boto3.client('s3')
bucket = os.environ['encryption_bucket']

def encrypt_zip(event, context):
    key_array = [key.replace('/', '-') for key in event['keys']]

    # Download objects
    for key in key_array:
        response = s3_client.download_file(bucket, key, '/tmp/' + key)

    # Zip objects
    with ZipFile('/tmp/foo.zip', 'w') as myzip:
        for key in key_array:
            myzip.write('/tmp/' + key)
        myzip.close()

    # Put zip file in S3
    s3_client.upload_file('/tmp/foo.zip', bucket, 'foo.zip')

(我还没有对此进行测试,我只是从 documentation 复制了 Zipfile 代码,所以我不确定它是否正确。)

我也不确定你想用 /- 来做什么,因为它取决于传入的键列表以及什么这些对象在 S3 中被调用。

关于python - 尝试从 s3 获取图像并打开图像时出现 OSError : cannot identify image file <_io. BytesIO 对象位于 0x00000198001B9E08>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53630380/

相关文章:

python - 如何对时间序列数据运行标准正态同质性检验

python - 如何在使用 PIL 修改文件上传表单后将文件上传到 s3?

ruby-on-rails - Ruby on Rails、Paperclip、Heroku、GitHub 和 AWS - 保护 key

amazon-web-services - 在 CDK 中配置 lambda 并发

java - AWS ApiGateway 延迟问题

python - 使用 Anaconda 安装 OSMnx

python - 创建内存中 zip 文件并作为 http 响应返回的函数

python - 将特定单元格定义为 pandas 数据框中的变量

amazon-web-services - 使用其预签名 URL 从 AWS s3 读取文件的内容

java - 如何使用 SQS 事件对 aws lambda 进行单元测试