Сохранение другого файла с тем же именем с помощью django-storage и boto

У меня есть модель Profile и связанная с ней ImageField.

Изображения загружаются в сегмент AWS S3 для хранения с использованием django-storages и boto.

Если я загружаю изображение с именем файла, которое уже существует (eg: sample.png), Django по умолчанию сохраняет новый файл как sample_1.png, который не работает при загрузке изображения в AWS S3. Есть ли способ решить эту проблему?

Как загрузить изображение с уже существующим именем файла в AWS S3, не перезаписывая его?


person Gowtham    schedule 12.04.2016    source источник
comment
Покажите код, который, как вы говорите, не работает.   -  person mootmoot    schedule 15.04.2016


Ответы (1)


Учитывая, что вы определили местоположение своей корзины в settings.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='частный'

person hhamalai    schedule 15.04.2016