2011-12-30 1 views
3

Я играю с 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.

+0

Вы можете использовать 'GridOut.length', чтобы увидеть, сколько байтов на самом деле хранятся, которые могут дать вам указания что вы не получаете все байты или если файл не был полностью сохранен. – cpburnz

+0

@cpburnz - Спасибо. Да, я тоже пробовал это, возвращает значение 274 (то же самое, что и с помощью tell()), что заставляет меня думать, что это кусок, который я возвращаю. – RobertMS

+0

Какую версию pymongo вы используете? – dcrosta

ответ

0

Вы можете попробовать проверить, что GridFS фактически хранит весь файл, т. Е. Вы не написали часть файла через консоль mongo. Это должно отображать ваше изображение вместе с другими вместе с длиной каждого файла. Таким образом, вы можете убедиться, что GridFS фактически содержит весь файл или нет.

db.fs.files.find().pretty() 

Если он полностью не поместилось, то Propably вы сделали что-то грязное время написания его к GridFS (как то, что @dcrosta сказал)

* Примечание: заменить имя коллекции в команде выше с "fs". Как:

db.<my_collection_name>.files.find().pretty() 

Если у вас есть много файлов, то попробуйте:

db.<my_collection_name>.files.findOne({'_id' : ObjectId("your object id as a hex string")}) 
1

Попробуйте изменить 'г' к 'гб' как folowing: >>> f = open('myimage.jpg', 'rb')

В зависимости от платформы (выигрыш/Linux/Mac), это может привести к проблемам

0

Получить данные outputdata

outputdata =fs.get(stored).read() 

Определить путь к файлу и режим открытой записи

outfilename = "path to output file" 
output= open(outfilename,"w") 

Запись данных и закрыть файл

output.write(outputdata) 
output.close()