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)