Как загрузить изображение из s3 и сохранить его как переменную вместо хранения в каталоге? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть несколько изображений в корзине на S3, и моя задача состоит в том, чтобы сгенерировать миниатюры для одной и той же корзины и загрузить их в другой каталог в той же корзине. Я буду использовать AWS Lambda, так как я хочу автоматически выполнить мой python скрипт для генерации миниатюр, если загружены какие-либо новые изображения.

Это то, что у меня есть:

from botocore.exceptions import NoCredentialsError, ClientError
from os import listdir
from PIL import Image
import boto3
import botocore

def get_img_list():

    s3 = boto3.client('s3')
        response = s3.list_objects_v2(
            Bucket='imagesforgreendub',
            Prefix='photo_test/',
            )

    for val in response['Contents']:
        if val['Key'] != 'photo_test/':
            temp = val['Key']
            img_name = temp.split('/')
            if img_name[1] != '':
                thumb_name = 'thumb_' + img_name[1]
                print(thumb_name)
                dld_img(val['Key'], thumb_name)

Вышеприведенная функция просто получает имена изображений из моей корзины S3.

Следующая функция - загрузить изображение и там, где я столкнулся с проблемой. download_file требует от меня указать имя / каталог для хранения изображения. Проблема в том, что я планирую запустить его на AWS лямбде, и я не думаю, что это позволит мне сохранить изображение. Таким образом, я sh извлек изображение и сохранил его в переменной, которую я могу передать в функцию создания миниатюр.

Я нашел этот поток ( Получить файл S3 как объект вместо загрузки в абсолют системный путь ), который сказал, что получает содержимое в виде строки, но как это будет работать, когда у меня есть файл изображения, и я использую PIL / Pillow для создания большого пальца, поэтому мне нужно передать изображение в качестве параметра.

def dld_img(key_name, thumb_name):
    s3 = boto3.resource('s3')

    try:
        local_img = s3.Bucket('imagesforgreendub').download_file(key_name, 'my_local_image.jpg')


    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "404":
            print("The object does not exist.")
        else:
            raise

def img_thumb(img, thumb_name):

    MAX_SIZE = (100, 100)

    img.thumbnail(MAX_SIZE)
    s3 = boto3.client('s3')
    s3.upload_file(img, 'imagesforgreendub', '%s/%s' % ('thumb_test', thumb_name))

Итак, подведем итог: как загрузить изображение из s3 и сохранить его в переменной, которую я затем могу передать в свою функцию img_thumb?

1 Ответ

0 голосов
/ 28 марта 2020

Можно попробовать следующее, чтобы прочитать изображение из s3 как изображение в подушке:

import os

import boto3

from PIL import Image

s3 = boto3.resource('s3')

def image_from_s3(bucket, key):

    bucket = s3.Bucket(bucket)
    image = bucket.Object(key)
    img_data = image.get().get('Body').read()

    return Image.open(io.BytesIO(img_data))

Чтобы вызвать его, вы можете использовать:

 img = image_from_s3(image_bucket, image_key)

Где img будет Подушка ' Изображение, которое вы должны быть в состоянии передать вашему img_thumb.

...