Я играю с MongoDB и API pymongo. Я могу поместить файл изображения в GridFS - кажется прямым:pymongo Получить изображение Назад из GridFS
>>> f = open('myimage.jpg', 'r')
>>> fs = gridfs.GridFS(db)
>>> fid = fs.put(f)
>>> fid
ObjectId('4efde2c27c7778121800000a')
Похоже, что он сработал. Я могу также запросить GridFS с помощью _id вернулся:
>>> fs.exists(fid)
True
Но я не кажется, чтобы быть в состоянии получить весь файл обратно - это выглядит, как я получаю ломоть?
>>> fs.get(fid).read()
'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00Z\x00Z\x00\x00\xff\xdb\x00C\x00
\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01
\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02\x01\x01
\x02\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x01\x02\x02\x02\x02\x02\x02
\x02\x02\x02\x02\xff\xdb\x00C\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x0
1\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0
2\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0
2\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\xff\xc0\x00\x11\x08\x03\x8d\x0
2X\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\
x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\
t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\
x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08
#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19'
>>> f.tell()
352256L
Я сделал ТЕЛЛЬ() на исходный файл, и вы можете видеть, что это гораздо больше, чем то, что я получаю из GridFS. Если я скажу() в файле, который я вернусь из GridFS, он находится в области 274. (Я понимаю, что tell() просто сообщает вам местоположение указателя в файле, но он дает указание на то, насколько он большой после уточнения.)
У меня явно что-то отсутствует! Как я могу получить файл обратно из GridFS целиком?
Я бегу v2.0.2 из mongodb и v2.1 pymongo на v2.7 из python.
Вы можете использовать 'GridOut.length', чтобы увидеть, сколько байтов на самом деле хранятся, которые могут дать вам указания что вы не получаете все байты или если файл не был полностью сохранен. – cpburnz
@cpburnz - Спасибо. Да, я тоже пробовал это, возвращает значение 274 (то же самое, что и с помощью tell()), что заставляет меня думать, что это кусок, который я возвращаю. – RobertMS
Какую версию pymongo вы используете? – dcrosta