2011-05-04 3 views
2

Я хочу создать миниатюры для загруженных изображений. Я знаю, что есть некоторые библиотеки, но у меня есть очень простые потребности, и я бы предпочел сделать это сам.Django save файл

Моя модель выглядит следующим образом:

from image_tools import resize 

class Photo(models.Model): 
    # some fields 
    image = models.ImageField(
       upload_to='images', 
       height_field='height', 
       width_field='width' 
      ) 
    thumb = models.ImageField(
     upload_to='thumbs', 
     editable=False 
    ) 

    def save(self): 
     self.thumb = self.image 
     resize(self.image.path, self.thumb.path, 50, 40) 
     super(Photo, self).save() 

Здесь resize() простая функция, которую я написал, который принимает в качестве аргументов путь к исходному файлу и путь назначения и размеры и хранит миниатюры. Единственная проблема заключается в том, что файл еще не находится на диске в данный момент.

Есть ли способ принудительно сохранить файл на своем месте, чтобы он был доступен моей функции?

Пожалуйста, не стесняйтесь предлагать лучшие способы решения этой проблемы. Тем не менее, я хотел бы знать, как обрабатывать файлы, которые еще не сохранены, какими бы ни были наилучшие решения.

ответ

1

Существует несколько способов сделать это. У вас есть необработанные данные изображения, вы можете легко записать его в файл (найдите загружаемый файл django, чтобы посмотреть, как сохранить загруженный файл на диск). Вы можете прочитать любой файл, к которому имеет доступ ваш django-процесс (или apache), а не только путь вашего экземпляра django.

Другая вещь, которую вы можете сделать, прежде чем экономить это использовать PIL к миниатюре изображения и сохранить его:
http://effbot.org/imagingbook/image.htm

Вы также можете загрузить данные в s3, используя Boto s3, если вы хотите, чтобы изображения, размещенного на CDN.

+0

Я прочитал выгрузку Джанго файл, и я не нашел ответа на мой вопрос. Можете ли вы быть более конкретным? «Как только у вас есть данные необработанного изображения, вы можете легко записать его в файл» - именно то, о чем я спрашиваю, как это сделать. – Andrea

1

Сохранение файла непосредственно не является хорошей идеей, потому что вы игнорируете хранения файлов по умолчанию (то есть файловая система, амазонка s3, ...)

Лучше подход заключается в использовании класс Джанго File

from django.core.files import File 
# Create a Python file object using open() and the with statement 
>>> with open('/tmp/hello.world', 'w') as f: 
...  myfile = File(f) 
...  myfile.write('Hello World') 

Также удалить файл использовать См ссылку на класс хранения по умолчанию ниже для более подробной информации https://docs.djangoproject.com/en/1.5/topics/files/