Pymongo Получить изображение обратно из GridFS - PullRequest
4 голосов
/ 30 декабря 2011

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

Я сделал tell () для исходного файла, и вы можете видеть, что он намного больше, чем то, что я получаю из GridFS. Если я выполняю функцию Tell () для файла, который я получаю от GridFS, он находится в области 274. (Я понимаю, что функция Tell () просто сообщает вам расположение указателя в файле, но дает представление о его размере. после прочтения.)

Я явно что-то здесь упускаю! Как я могу получить файл обратно из GridFS в полном объеме?

Я использую v2.0.2 mongodb и v2.1 pymongo на v2.7 python.

Ответы [ 3 ]

1 голос
/ 22 июля 2015

Попробуйте изменить 'r' на 'rb' следующим образом: >>> f = open('myimage.jpg', 'rb')

В зависимости от вашей платформы (win / linux / mac) это может вызвать проблемы

1 голос
/ 10 декабря 2014

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

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

Если он не удерживает ваш файл полностью, то, вероятно, вы сделали что-то нехорошее, записывая его в 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")})
0 голосов
/ 02 августа 2016

Получить данные для выходных данных

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

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

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

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

output.write(outputdata)
output.close()
...