2016-04-12 2 views
3

У меня есть модель Profile и связанная с ней связанная с ней ImageField.Сохранение другого файла с тем же именем с использованием django-storage и boto

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

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

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

+0

Показать код, который вы говорите «не работает». – mootmoot

ответ

3

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

Смежные вопросы