2012-06-15 1 views
1

Я использую Django-Cumulus для хранения изображений на платформе Cloudfiles от Rackspace.Как я могу программно сохранить изображение в ImageField с помощью Django-Cumulus?

Я хочу, динамически манипулировать изображениями и сохранять их в качестве нового ImageField для моей модели. Например, у меня есть фотомодель с этими ImageFields: image, thumb_256x256

В методе save() моей формы я разрешаю пользователю указывать места обрезки (используя JCrop).

В любом случае, я знаю, как захватить существующий файл изображения, который пользователь загрузил. Я также знаю, как применять манипуляции с PIL. Проблема, с которой я столкнулся, - создать новый файл Rackspace и записать его.

Я продолжаю получать исключение «NoSuchObject».

Вот пример кода:

def save(self, commit=True): 
    """ Override the Save method to create a thumbnail of the image. """ 
    m = super(PhotoUpdateForm, self).save(commit=False) 

    image = Image.open(m.image.file) 
    image.thumbnail((256,256), Image.ANTIALIAS) 
    thumb_io = CloudFilesStorageFile(storage=CLOUDFILES_STORAGE, name='foo/bar/test.jpg') 
    image.save(thumb_io.file, format='JPEG') 

Кроме того, когда я доберусь до этой точки - что это лучший способ создания изображения на другой ImageField в модели? (m.thumb_256x256 в моем случае)

Спасибо в продвинутом состоянии!

Обновление: фактическое имя приложения Cloudfiles Django Я использую это «django-cumulus»

ответ

0

Вот это временное решение. У меня возникла проблема с настройкой нового имени файла. Он просто добавляет _X к имени файла. Так, например, somefilename.jpg становится somefilename_1.jpg всякий раз, когда я сохраняю новую версию.

Этот код немного уродлив, но выполняет эту работу. Он создает обрезанную версию изображения и при необходимости генерирует эскиз.

def save(self, commit=True): 
    """ Override the Save method to create a thumbnail of the image. """ 
    m = super(PhotoUpdateForm, self).save(commit=False) 

    # Cropped Version 
    if set(('x1', 'x2', 'y1', 'y2')) <= set(self.cleaned_data): 
     box = int(self.cleaned_data['x1']), \ 
       int(self.cleaned_data['y1']), \ 
       int(self.cleaned_data['x2']), \ 
       int(self.cleaned_data['y2']) 
     image = Image.open(m.image.file) 
     image = image.crop(box) 
     temp_file = NamedTemporaryFile(delete=True) 
     image.save(temp_file, format="JPEG") 
     m.image.save("image.jpg", File(temp_file)) 
     cropped = True # Let's rebuild the thumbnail 

    # 256x256 Thumbnail 
    if not m.thumb_256x256 or cropped: 
     if not image: 
      image = Image.open(m.image.file) 
     image.thumbnail((256,256), Image.ANTIALIAS) 
     temp_file = NamedTemporaryFile(delete=True) 
     image.save(temp_file, format="JPEG") 
     m.thumb_256x256.save("thumbnail.jpg", File(temp_file)) 

    if commit: m.save() 
    return m