2011-12-30 30 views
3

我在玩MongoDB和pymongo API。我可以把一個圖像文件放到GridFS中 - 看起來很簡單:pymongo獲取圖像返回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中獲得的大得多。如果我在文件上做了一個tell(),我從GridFS返回它在274的區域。(我明白,tell()只是告訴你文件中的指針位置,但它表明它有多大)

我明顯錯過了這裏的東西!我如何才能將文件全部退出GridFS?

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

+0

你可以用'GridOut.length',看看有多少字節的實際存儲了可以給你指示至於你是否沒有得到所有的字節或者文件沒有​​被完全存儲。 – cpburnz 2011-12-30 16:48:57

+0

@cpburnz - 謝謝 - 是的,我也試過,返回值爲274(與使用tell()相同),這導致我認爲這是一個塊,我回來了。 – RobertMS 2011-12-30 16:51:03

+0

你使用的是什麼版本的pymongo? – dcrosta 2011-12-30 17:16:21

回答

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

嘗試改變 'R' 到 'RB' 爲如下因素:>>> f = open('myimage.jpg', 'rb')

根據您的平臺(WIN/linux/mac)這可能會導致問題

0

獲取數據到輸出數據

​​

定義文件的路徑和開放寫入模式

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

寫入數據,並關閉文件

output.write(outputdata) 
output.close()