Получение ширины и высоты файла изображения, хранящегося в AWS S3 Bucket в Laravel - PullRequest
0 голосов
/ 18 мая 2018

Я занимаюсь разработкой веб-приложения с использованием Laravel.Я храню все файлы изображений в AWS S3 Bucket.Теперь мне нравится получать ширину и высоту файла изображения, хранящегося на s3.Но я храню все файлы изображений как частные, так что я не могу получить к ним доступ с URL-адреса s3.В своем коде я загружаю файл изображения из s3 следующим образом

file = Storage::disk('s3')->get($s3_file_name);

Если я хочу отобразить изображение в браузере, я возвращаю изображение в методе действия следующим образом.

return response($file)->header('Content-Type', 'image/png');

Но мне нравится получать ширину и высоту изображения после загрузки с s3 следующим образом.

file = Storage::disk('s3')->get($s3_file_name);

Как я могу получить это?

Я не могу использовать getimagesize (имя файла), поскольку я храню этот файл как частный на корзине s3.

1 Ответ

0 голосов
/ 19 мая 2018

Вы можете создать лямбда-функцию, которая запускается при загрузке изображения, автоматически рассчитывает размеры и сохраняет результаты в таблице DynamodB, а затем вы можете ссылаться на результат, сохраненный в таблице DynamodB, с помощью своего кода Laravel.

Это довольно легко сделать с python:

from PIL import Image
import boto3

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(
            event['Records'][0]['s3']['object']['key'].encode('utf8'))

    s3 = boto3.client('s3')
    dynamodb = boto3.client('dynamodb')

    local = '/tmp/'+key
    s3.download_file(bucket,key, local)
    im = Image.open(local)

    width, height = im.size

    dynamodb.put_item(
        TableName='dimension',
        Item={
           'keyname': {'S': key},
           'height': {'N': height},
           'width': {'N': width}
            })

Предварительные условия:

1. Не забудьте сделать таблицу динамод сначала названной размерность и имя ключа в качестве первичного ключа

Поскольку PIL или PILLOW не является стандартным библиотекой python, встречающейся в лямбда-среде, вам необходимо создать собственный пакет развертывания, и вот как вы это сделаете: https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...