У меня есть несколько изображений в корзине на 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?