将文件(大小<16MB)上传到MongoDB

时间:2016-10-13 07:44:15

标签: python mongodb file file-upload

我需要将文件上传到MongoDB。目前我使用Flask将文件保存在当前文件系统的文件夹中。有没有办法可以在不使用GridFS的情况下将文件上传到MongoDB?我相信我早就做过类似的事情,但是自从我上次使用MongoDB以来已经很久没有回忆起来了。

我选择上传的任何文件大小不超过16MB。

更新:我尝试使用binData转换图片文件,但会引发错误global name binData is not defined

import pymongo
import base64
import bson

# establish a connection to the database
connection = pymongo.MongoClient()

#get a handle to the test database
db = connection.test
file_meta = db.file_meta
file_used = "Headshot.jpg"

def main():
    coll = db.sample
    with open(file_used, "r") as fin:
        f = fin.read()
        encoded = binData(f)

    coll.insert({"filename": file_used, "file": f, "description": "test" })

1 个答案:

答案 0 :(得分:3)

Mongo BSON(https://docs.mongodb.com/manual/reference/bson-types/)具有字段的二进制数据(binData)类型 Python驱动程序(http://api.mongodb.com/python/current/api/bson/binary.html)支持它。

您可以将文件存储为字节数组。

您的代码应略有修改:

  1. 添加导入:from bson.binary import Binary
  2. 使用二进制编码文件字节:encoded = Binary(f)
  3. 在insert语句中使用编码值。
  4. 以下完整示例:

    import pymongo
    import base64
    import bson
    from bson.binary import Binary
    
    # establish a connection to the database
    connection = pymongo.MongoClient()
    
    #get a handle to the test database
    db = connection.test
    file_meta = db.file_meta
    file_used = "Headshot.jpg"
    
    def main():
        coll = db.sample
        with open(file_used, "rb") as f:
            encoded = Binary(f.read())
    
        coll.insert({"filename": file_used, "file": encoded, "description": "test" })