Сохранение другого файла с тем же именем с использованием 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'

Другие вопросы по тегам