将图像存储在MongoDB中

时间:2015-02-04 17:34:47

标签: python mongodb pymongo gridfs

我正在使用PyMongo连接到我的数据库,当用户使用GridFS在集合中的用户特定文档中上传我想要存储的图像时。我是这样做的:

class uploadHandler(BaseHandler):

@tornado.web.authenticated

def get(self):

    self.render("upload.html",user=self.current_user)

def post(self):
    db = pymongo.Connection('mongodb://heroku_app.mongolab.com:/heroku_app').heroku_appxxxx
    user = db.userInfo.find_one({'Username':self.current_user})
    file1 = self.request.files['images'][0]
    original_fname = file1['filename']

    print "file: " + original_fname + " is uploaded"

    fs = gridfs.GridFS(user)
    fs.put(file1)
    #db.userInfo.update({'Username':self.current_user},{'$push':{'Images': file1}})  

    self.redirect('/upload')

但这给了我错误:

  Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\tornado\web.py", line 1332, in _execute
    result = method(*self.path_args, **self.path_kwargs)
  File "C:\Users\rsaxs\workspace\pie\src\Server.py", line 4101, in post
    fs = gridfs.GridFS(user)
  File "C:\Python27\lib\site-packages\gridfs\__init__.py", line 53, in __init__
    raise TypeError("database must be an instance of Database")
TypeError: database must be an instance of Database

如何将图像最好地存储在集合中特定文档的mongoDB中?

2 个答案:

答案 0 :(得分:2)

使用GridFS,您可以保存和读取超过BSON文档文件大小限制(16 MB)的文件。它通常用于存储媒体,因为您可以将数据流式传输到客户端。

GridFS有一个特定的文档结构 - 它实际上由多个文档组成,只需在向GridFS插入内容时在db中检查它。由于它具有特殊结构且files可能超过16MB文档大小限制,因此您无法在其他文档中包含GridFS文档。

如果要引用某些GridFS对象,可以保存特定GridFS文件的file_id,并在需要检索内容时查询。

答案 1 :(得分:1)

您需要将数据库对象传入GridFS构造函数。

fs = gridfs.GridFS(db)