pymongo从GridFS中获取图像

时间:2011-12-30 16:38:57

标签: python mongodb pymongo gridfs

我正在玩MongoDB和pymongo API。我可以将一个图像文件放到GridFS中 - 看起来很简单:

>>> f = open('myimage.jpg', 'r')
>>> fs = gridfs.GridFS(db)
>>> fid = fs.put(f)
>>> fid
ObjectId('4efde2c27c7778121800000a')

看起来它有效。我也可以使用返回的_id查询GridFS:

>>> fs.exists(fid)
True

但我似乎无法将WHOLE文件退出 - 看起来我正在获得一个chunK?

>>> 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中得到的要大得多。如果我对从GridFS返回的文件执行一个tell(),那么它位于274区域。(我知道tell()只是告诉你文件中的指针位置,但是它指示了它有多大在读完之后。)

我显然在这里遗漏了一些东西!如何从GridFS中完全取回文件?

我在python的v2.7上运行mongodb的v2.0.2和pymongo的v2.1。

3 个答案:

答案 0 :(得分:1)

您可以尝试检查是否GridFS实际上保存了整个文件,即您没有通过mongo控制台写入文件的一部分。这应该列出您的图像以及其他文件的长度。因此,您可以验证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")})

答案 1 :(得分:1)

尝试将'r'更改为'rb',如下所示:onConnectionFail()

根据您的平台(win / linux / mac),这可能会导致问题

答案 2 :(得分:0)

获取数据到outputdata

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

定义文件路径并打开写入模式

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

写入数据并关闭文件

output.write(outputdata)
output.close()