Я искал способ загрузить изображение из 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 файла изображения, он работал нормально.