使用pymongo在Mongodb的GridFS中保存文件会导致截断文件。
from pymongo import MongoClient
import gridfs
import os
#just to make sure we aren't crazy, check the filesize on disk:
print os.path.getsize( r'owl.jpg' )
#add the file to GridFS, per the pymongo documentation: http://api.mongodb.org/python/current/examples/gridfs.html
db = MongoClient().myDB
fs = gridfs.GridFS( db )
fileID = fs.put( open( r'owl.jpg', 'r') )
out = fs.get(fileID)
print out.length
在Windows 7上,运行此程序会生成此输出:
145047
864
在Ubuntu上,运行此程序会生成此(正确)输出:
145047
145047
不幸的是,我正在处理的应用程序是针对Windows操作系统......
任何帮助将不胜感激!
所以你可以更严格地再现我的例子,'owl.jpg'从以下网址下载:http://getintobirds.audubon.org/sites/default/files/photos/wildlife_barn_owl.jpg
答案 0 :(得分:8)
嘿,改变
fileID = fs.put( open( r'owl.jpg', 'r') )
为:
fileID = fs.put( open( r'owl.jpg', 'rb') )
修复了Windows 7上程序的行为。太糟糕了,操作系统的行为不同......
答案 1 :(得分:3)
你已经得到了答案,但对于好奇的人来说:
http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
在Windows上,附加到模式的'b'以二进制模式打开文件,因此还有'rb','wb'和'r + b'等模式。 Windows上的Python区分文本和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍微改变。这种对文件数据的幕后修改适用于ASCII文本文件,但它会破坏像JPEG或EXE文件中的二进制数据。在读写这些文件时要非常小心使用二进制模式。