pymongo 从 GridFS 获取图像

发布于 2024-12-23 12:29:09 字数 1736 浏览 2 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凉城已无爱 2024-12-30 12:29:09

获取数据到outputdata

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

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

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

写入数据并关闭文件

output.write(outputdata)
output.close()

Get data to outputdata

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

Define file path and open write mode

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

Write data and close file

output.write(outputdata)
output.close()
水中月 2024-12-30 12:29:09

您可以尝试检查 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")})

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.

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

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:

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

If you have a lot of files then try:

db.<my_collection_name>.files.findOne({'_id' : ObjectId("your object id as a hex string")})
Hello爱情风 2024-12-30 12:29:09

尝试将“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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文