mongodb存儲二進制數據的二種方式——binary bson或gridfs


python 版本為2.7

mongodb版本2.6.5

 

使用mongodb存儲文件,可以使用兩種方式,一種是像存儲普通數據那樣,將文件轉化為二進制數據存入mongodb,另一種使用gridfs,咱們先來說說第一種

 

先讀取文件內容,然后塞進bson.binary.Binary對象里,最后像平常那樣寫入數據庫,是不是很簡單呢,獲取文件一樣的簡單,像平時那樣查找數據,然后將二進制內容寫入文件即可

 

#coding=utf-8
''' Created on 2015-10-8 @author: kwsy2015 ''' import pymongo import bson.binary from pymongo import MongoClient from cStringIO import StringIO def insertFile(): client = MongoClient('localhost', 27017) #獲得一個database db = client.MongoFile #獲得一個collection coll = db.image filename = 'F:/測試數據/hehe.jpg'.decode('utf-8') with open (filename,'rb') as myimage: content = StringIO(myimage.read()) coll.save(dict( content= bson.binary.Binary(content.getvalue()), filename = 'hehe.jpg' )) def getFile(): client = MongoClient('localhost', 27017) #獲得一個database db = client.MongoFile #獲得一個collection coll = db.image data = coll.find_one({'filename':'hehe.jpg'}) out = open('F:/測試數據/test4.jpg'.decode('utf-8'),'wb') out.write(data['content']) out.close() getFile()

因為我的文件路徑都帶有中文,因此需要用utf-8解碼,否則會報錯的

 

使用上述方法存儲小文件是很方便的,那么如果是大文件呢,可以使用gridfs

        gridfs會把文件分成若干塊來存儲,每一塊的大小默認為256K,所以,如果是小文件,就不要用gridfs來存儲了,不然會浪費空間的,gridfs是MongoDB之上的分布式文件系統,可以使用mongodb的分片和復制機制,因為Mongodb分配數據空間時以2GB為單位,所以gridfs不產生磁盤碎片。

        

#coding=utf-8
''' Created on 2015-9-29 @author: Administrator ''' from pymongo import MongoClient from bson.objectid import ObjectId from gridfs import * def insertFile(): client = MongoClient('localhost', 27017) db = client.Pic fs = GridFS(db, 'images') with open ('F:/測試數據/hehe.jpg'.decode('utf-8'),'rb') as myimage: data=myimage.read() id = fs.put(data,filename='first') print id def getFile(): client = MongoClient('localhost', 27017) db = client.Pic fs = GridFS(db, 'images') file = fs.get_version('first', 0) data = file.read() out = open('F:/測試數據/test3.jpg'.decode('utf-8'),'wb') out.write(data) out.close() def delFile(): client = MongoClient('localhost', 27017) db = client.Pic fs = GridFS(db, 'images') fs.delete(ObjectId('560a531b0d4eae34a4edbfdd')) def listName(): client = MongoClient('localhost', 27017) db = client.Pic fs = GridFS(db, 'images') print fs.list() listName()

寫入文件時,我們可以設置它的filename,如果多個文件使用同一個filename呢,我們在獲取文件時可以使用get_version()函數,第一個參數是filename,第二個參數是版本,從0開始。

 

此外,我們還可以使用get(),函數,需傳入文件的ObjectId

使用python操作gridfs總得來說是很方便的,畢竟所提供的函數就那么幾個,稍微用心看看源碼就沒問題了

 

轉自:http://www.voidcn.com/blog/KWSY2008/article/p-4871553.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM