Django aws s3 изменение размера изображения при загрузке и доступ к различным размерам изображения

Я хотел бы изменить размер загруженного изображения в различные категории:

  • оригинал
  • medium (500kb)
  • small (200kb)

И сохраните его на AWS S3. И позже сможете получить к нему доступ. Одна из стратегий заключается в том, чтобы сохранить его в filename_small.jpg, filename_medium.jpg, иметь вспомогательную функцию, чтобы иметь возможность добавлять _small, _medium для доступа к этим файлам. Я не уверен, как сохранить все разные файлы (изменить размер), а затем получить доступ к нему с помощью помощника.

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/storage_backends.py

class MediaStorage(S3Boto3Storage):
    location = 'media'
    file_overwrite = False

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/models.py

class Employee(models.Model):
...
    face_image = models.FileField(upload_to=upload_to('employee/face_image/'), blank=True, storage=MediaStorage())

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/api.py

@api_view(['POST'])
def update_employee_image(request):
...
    employee = Employee.objects.get(id = employee_id)
    employee.face_image = face_image_obj
    employee.save()

Я использую django-хранилища и S3Boto3Storage. Мой полный рабочий проект находится в ссылках git.

Ответы

Ответ 1

В зависимости от вашего варианта использования я предлагаю использовать sorl-thumbnail, который работает с django-storages и будет обрабатывать изменение размера для вас, и означает, что вам не нужно выполнять работу по управлению разными размерами самостоятельно.

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

{% thumbnail item.image "300" crop="center" as im %}
    <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}

Это создаст миниатюру максимальную ширину 300 пикселей, которая будет генерироваться в первый раз и сохранена на s3.

Приложение имеет API низкого уровня, который вы можете использовать, если вам нужно создавать и извлекать миниатюры вне контекста шаблона:

from sorl.thumbnail import get_thumbnail

im = get_thumbnail(my_file, '100x100', crop='center', quality=99)