Store images in MongoDB

白昼怎懂夜的黑 提交于 2020-01-25 06:12:44

问题


I'm using PyMongo to connect to my database, when a user uploads an image I want to store it using GridFS within the users specific document in the collection. I'm doing it as so:

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')

But this gives me the error:

  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

How can an image be best stored in a mongoDB in a particular document within a collection then?


回答1:


With GridFS you can save and read files that exceed the BSON document file size limit (16 MB). It is often used to store media since you can stream your data to the client.

GridFS has a specific document structure -- it actually consists of multiple documents, just check it in your db when you insert something to GridFS. Since it has a special structure and files can potentially exceed the 16MB document size limit you cannot include GridFS docs in other documents.

If you want to reference some GridFS objects you can by saving the file_id of the specific GridFS file and querying that when you need to retrieve it's content.




回答2:


You need to pass in the database object into the GridFS constructor.

fs = gridfs.GridFS(db)


来源:https://stackoverflow.com/questions/28327746/store-images-in-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!