Сохранение другого файла с тем же именем с использованием django-storage и boto
У меня есть модель Profile
и ImageField
связано с этим.
Изображения загружаются в корзину AWS S3 для хранения с использованием django-storages
а также boto
,
Если я загружаю изображение с именем файла, который уже существует (eg: sample.png
) Django по умолчанию сохранит новый файл как sample_1.png
который не работает при загрузке изображения в AWS S3. Есть ли способ решить эту проблему?
Как загрузить изображение с уже существующим именем файла в AWS S3
без перезаписи?
1 ответ
Если вы определили местоположение своего сегмента в настройках.MYMODEL_FILES_LOCATION вы можете использовать следующее для переименования загруженных файлов в произвольном месте, возможно, полученном из исходного имени файла. Следующий фрагмент сохранит файлы в / mymodelfiles /. Свойства экземпляра модели могут быть доступны из объекта экземпляра в методе переименования, так что вы можете, например, загружать файлы от одного и того же пользователя в одном и том же подкаталоге.
import uuid
import os
from django.utils.deconstruct import deconstructible
from storages.backends.s3boto import S3BotoStorage
from django.db import models
from django.conf import settings
def path_and_rename(prefix, filename):
ext = filename.split('.')[-1]
filename = '{}.{}'.format(uuid.uuid4().hex, ext)
return os.path.join(prefix, filename)
def get_path_for_my_model_file(instance, filename):
return path_and_rename('mymodelfiles/', filename)
@deconstructible
class MyS3BotoStorage(S3BotoStorage):
pass
class MyModel(models.Model):
resources = models.FileField(
upload_to=get_path_for_my_model_file,
storage=MyS3BotoStorage(bucket=settings.MYMODEL_FILES_LOCATION))
Конструктор S3BotoStorage может использовать аргумент ключевого слова "acl", чтобы установить разрешения для загружаемого файла, например, acl='private'