Вопрос также возникает, как получить данные в BLOB. Можно поместить данные в оператор INSERT, поскольку пример PHP показывает (хотя необходимо использовать mysql_real_escape_string вместо addslashes). Если файл существует на сервере базы данных, можно также использовать MySQL LOAD_FILE
Я подозреваю, что вы не seek
-скачиваете обратно в начало буфера перед тем, как передать объект StringIO в PIL. Вот код, демонстрирующий проблему и решение:
>>> buff = StringIO.StringIO()
>>> buff.write(open('map.png', 'rb').read())
>>>
>>> #seek back to the beginning so the whole thing will be read by PIL
>>> buff.seek(0)
>>>
>>> Image.open(buff)
<PngImagePlugin.PngImageFile instance at 0x00BD7DC8>
>>>
>>> #that worked.. but if we try again:
>>> Image.open(buff)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\python25\lib\site-packages\pil-1.1.6-py2.5-win32.egg\Image.py", line 1916, in open
raise IOError("cannot identify image file")
IOError: cannot identify image file
Убедитесь, что вы вызываете buff.seek (0)
перед чтением любых объектов StringIO. В противном случае вы будете читать с конца буфера, который будет выглядеть как пустой файл и, вероятно, вызовет ошибку, которую вы видите.
Вы должны либо вызвать buff.seek (0)
, либо, что лучше, инициализировать буфер памяти данными StringIO .StringIO (данные)
.