Python/Django скачать изображение с URL, изменить и сохранить в ImageField

Я искал способ загрузить изображение из URL-адреса, предварительно обработать некоторые действия с имитацией изображений (изменения размера), а затем сохранить его на графическом элементе django. Используя две большие записи (связанные ниже), я смог загрузить и сохранить изображение в ImageField. Тем не менее, у меня были некоторые проблемы с манипулированием файлом, когда он у меня есть.

В частности, для метода model() save() для модели требуется объект File() в качестве второго параметра. Поэтому мои данные должны в конечном итоге быть объектом File(). В приведенных ниже сообщениях блога показано, как использовать urllib2 для сохранения URL-адреса изображения в объект File(). Это здорово, однако, я также хочу манипулировать изображением, используя PIL как объект Image(). (или объект ImageFile).

Мой предпочтительный подход заключается в том, чтобы загрузить URL-адрес изображения непосредственно в объект Image(), предварительно изменить размер и преобразовать его в объект File(), а затем сохранить его в модели. Однако мои попытки конвертировать Image() в файл() не удались. Если это вообще возможно, я хочу ограничить количество раз, которое я пишу на диск, поэтому я хотел бы сделать это преобразование объекта в памяти или с помощью объекта NamedTemporaryFile (delete = True), поэтому мне не нужно беспокоиться о добавляются дополнительные файлы. (Конечно, я хочу, чтобы файл записывался на диск после его сохранения через модель).

import urllib2
from PIL import Image, ImageFile    
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

inStream = urllib2.urlopen('http://www.google.com/intl/en_ALL/images/srpr/logo1w.png')

parser = ImageFile.Parser()
while True:
    s = inStream.read(1024)
    if not s:
        break
    parser.feed(s)

inImage = parser.close()
# convert to RGB to avoid error with png and tiffs
if inImage.mode != "RGB":
    inImage = inImage.convert("RGB")

# resize could occur here

# START OF CODE THAT DOES NOT SEEM TO WORK
# I need to somehow convert an image .....

img_temp = NamedTemporaryFile(delete=True)
img_temp.write(inImage.tostring())
img_temp.flush()

file_object = File(img_temp)

# .... into a file that the Django object will accept. 
# END OF CODE THAT DOES NOT SEEM TO WORK

my_model_instance.image.save(
         'some_filename',
         file_object,  # this must be a File() object
         save=True,
         )

При таком подходе файл выглядит поврежденным всякий раз, когда я рассматриваю его как изображение. Кто-нибудь имеет какой-либо подход, который берет файл с URL-адреса, позволяет управлять им как изображение, а затем сохранять его на Django ImageField?

Любая помощь очень ценится.

Программно сохранить изображение в Django ImageField

Django: добавьте изображение в ImageField из URL-адреса изображения

Обновление 08/11/2010: я действительно закончил с StringIO, однако, я был stringIO выбрасывал необычное исключение, когда я пытался сохранить его в Django ImageField. В частности, трассировка стека показала ошибку имени:

"AttribueError exception "StringIO instance has no attribute 'name'"

После ротации через источник Django, эта ошибка возникла, когда модель сохраняет попытку доступа к атрибуту размера файла StringIO. (Хотя приведенная выше ошибка указывает на проблему с именем, основной причиной этой ошибки является отсутствие свойства размера на изображении StringIO). Как только я присвоил значение атрибуту size файла изображения, он работал нормально.

Ответ 1

В попытке убить 2 птиц одним камнем. Почему бы не использовать объект (c) StringIO вместо NamedTemporaryFile? Вам больше не придется хранить его на диске, и я знаю, что что-то подобное работает (я сам использую аналогичный код).

from cStringIO import StringIO
img_temp = StringIO()
inImage.save(img_temp, 'PNG')
img_temp.seek(0)

file_object = File(img_temp, filename)