2016-10-13 96 views
0

我有一個要求上傳文件到MongoDB。目前我正在使用Flask將文件保存在當前文件系統的文件夾中。有沒有一種方法可以在不使用GridFS的情況下將文件上傳到MongoDB?我相信我很久以前就做過這樣的事情,但自從我上次使用MongoDB以來,我一直無法回憶。上傳文件(大小<16MB)到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" }) 
+0

你試過將其保存爲一個blob的文件? – Sammaye

回答

1

蒙戈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. 使用二進制編碼文件的字節:在INSERT語句encoded = Binary(f, 0)
  3. 使用編碼值。

全部下面的例子:

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, "r") as fin: 
     f = fin.read() 
     encoded = Binary(f, 0) 

    coll.insert({"filename": file_used, "file": encoded, "description": "test" }) 
+0

我無法使用binData類型上傳文件。不知道我是否正確地將文件轉換爲使用binData。你能不能讓我知道這段代碼有什麼問題。 –

+0

並感謝您的時間。我很感激。 @mike –

+0

非常感謝@Mike。它像一個魅力。儘管一個小小的改正。我不得不在「rb」模式下打開文件。 –