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
但我似乎无法取回整个文件 - 看起来我得到了一个块?
>>> 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。
I am playing around with MongoDB and the pymongo API. I can put an image file in to GridFS - seems straight forward:
>>> f = open('myimage.jpg', 'r')
>>> fs = gridfs.GridFS(db)
>>> fid = fs.put(f)
>>> fid
ObjectId('4efde2c27c7778121800000a')
Looks like it has worked. I can also query GridFS using the _id returned:
>>> fs.exists(fid)
True
But I dont seem to be able to get the WHOLE file back out - it looks like I am getting a 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
I did a tell() on the original file and you can see that it is much larger than what I get out of GridFS. If I do a tell() on the file that I get back from GridFS it is in the region of 274. (I understand that tell() just tells you the pointer location in the file, but it gives an indication of how big it is after reading.)
I am obviously missing something here! How can I get the file back out of GridFS in its entirety?
I am running v2.0.2 of mongodb and v2.1 of pymongo on v2.7 of python.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
获取数据到outputdata
定义文件路径并打开写入模式
写入数据并关闭文件
Get data to outputdata
Define file path and open write mode
Write data and close file
您可以尝试检查 GridFS 是否确实保存了整个文件,即您没有通过 mongo 控制台写入文件的一部分。这应该列出您的图像以及其他图像以及每个文件的长度。因此您可以验证 GridFS 是否确实保存了您的整个文件。
如果它没有完全保存您的文件,那么您可能在将其写入 GridFS 时做了一些混乱的事情(例如 @dcrosta 说)
*注意:将上述命令中的集合名称替换为“fs”。例如:
如果您有很多文件,请尝试:
You can try to check wether GridFS actually holds the entire file, i.e. you've not written a part of the file through the mongo console. This should list your image along with others along with the length of the each file. So you can verify wether GridFS actually holds you entire file or not.
If it does not hold your file fully, then propably you did something messy while writing it to the GridFS (like what @dcrosta said)
*Note: replace your collection name in the above command with "fs". Like:
If you have a lot of files then try:
尝试将“r”更改为“rb”,如下所示:
>>> f = open('myimage.jpg', 'rb')
根据您的平台 (win/linux/mac),这可能会导致问题
Try changing 'r' to 'rb' as folowing:
>>> f = open('myimage.jpg', 'rb')
Depending on your platform (win/linux/mac) this might cause problems