Создание миниатюр вручную и загрузка их в ведро S3

Мое веб-приложение ориентировано на изображения, и когда пользователь загружает изображение (любого размера), мне нужно создать миниатюру и сохранить ее, чтобы я мог использовать миниатюру, а не оригинальное изображение. Я использую AWS S3 bucket, boto3, django-storages. Загрузка файлов работает безупречно, проблема в том, что когда я создаю миниатюру и загружаю в ведро S3 с другим именем файла (ошибка не возникает, но я не вижу ни созданных, ни сохраненных миниатюр)

Это мой settings.py

Media root

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

AWS Специфические настройки (я не переопределял MEDIA_ROOT)

AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME')
AWS_QUERYSTRING_AUTH = False
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_DEFAULT_ACL = os.getenv('AWS_DEFAULT_ACL')
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
AWS_S3_FILE_OVERWRITE=False

# s3 static settings
STATIC_LOCATION = 'static'
STATIC_ROOT = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/'
CKEDITOR_BASEPATH = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/ckeditor/ckeditor/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# s3 public media settings
PUBLIC_MEDIA_LOCATION = 'media'
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{PUBLIC_MEDIA_LOCATION}/'
#MEDIA_ROOT = f'https://{AWS_S3_CUSTOM_DOMAIN}/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Код, куда я загружаю сгенерированные файлы миниатюр (если он вообще генерируется):

Я использую библиотеку Pillow для генерации миниатюр

Версия 1 кода:

tfname = os.path.join(os.path.join(settings.BASE_DIR,"media"), file_name)
image.save(tfname)

Версия 2 кода (увидел его где-то на этом сайте и попробовал):

import boto3
s3 = boto3.resource('s3')
s3.Bucket(settings.AWS_STORAGE_BUCKET_NAME).upload_file('/{0}'.format(file_name),file_name)

Ни один из них не работает, не выбрасывает никаких исключений/ошибок

Я бы рекомендовал вам использовать что-то вроде thumbor (исходный код: https://github.com/thumbor/thumbor).

В основном функциональность thumbor заключается в хранении преобразований, сделанных с исходным изображением, и кэшировании преобразованного изображения. С подходом, подобным тому, который предлагает этот пакет, вам не нужно будет вручную сохранять уменьшенное изображение из оригинала. Механизм кэширования позволяет быстрее получать миниатюры после первого преобразования исходного изображения. Как говорится в документации, он предлагает поддержку сервисов AWS S3. Я оставлю несколько туториалов, которые могут быть полезны (https://dev.to/jrgarciadev/how-to-create-your-own-image-cdn-with-thumbor-and-aws-hpg, https://medium.com/@adam_70793/best-thumbnailing-solution-set-up-thumbor-on-aws-c5625c25a564)

Если вы предпочитаете идти по текущему пути, мы должны проверить, как вы обрабатываете загрузку оригинальных изображений и попытаться имитировать это с новыми уменьшенными изображениями.

Вернуться на верх