mongodb怎麼存圖片

davidtim發表於2021-09-11

mongodb怎麼存圖片

利用mongodb儲存圖片通常有兩種方法,一種是將圖片資料轉化為二進位制作為字典的鍵值對進行儲存,另一種是利用mongodb提供的

GridFS進行儲存,兩者各有利弊。效能方面的優劣未曾測試,無法進行評價,此處僅對兩種方式進行介紹,若有徹知者還望指教。 

下面以如下資料作為示例進行介紹: 

資料示例

dic = {
    "owner_name" : "samssmilin",
    "photo_id" : "602880671",
    "tags" : "",
    "longitude" : "-121.106479",
    "height" : "766",
    "datetaken" : "2004-01-17 21:05:35",
    "width" : "1024",
    "length" : 38141,
    "photo_title" : "Dad and Elijah",
    "latitude" : "35.565222",
    "photo_url" : "",
    "dateupload" : "1075355967",
    "owner_id" : "45365637@N00"
}

一、GridFS

GridFS將圖片資料與圖片屬性資料分開儲存,用chunks來儲存圖片資料,files儲存屬性資料,一個圖片file可能對應多個chunks,每個

chunk的記憶體大小固定(16M),若圖片資料大於chunk,則分為多個chunk儲存,用同一個ObjectID關聯,下載時自動將多個chunk合

併為圖片資料。 

上傳

from pymongo import MongoClient
from gridfs import *
import requests

client = MongoClient('127.0.0.1', 27017) #連線mongodb
db = client.photo #連線對應資料庫
#db.authenticate("username","passowd")
fs = GridFS(db, collection="images") #連線collection
data = requests.get(dic["photo_url"], timeout=10).content
# 確認資料庫中不存在此圖片之後再儲存
if not fs.find_one({"photo_url":dic["photo_url"]}):
    fs.put(data, **dic)
# 上傳成功後,photo資料庫下出現兩個collection,分別為: images.files, images.chunks12345678910111213

下載

from pymongo import MongoClient
from gridfs import *
client = MongoClient('127.0.0.1', 27017) #連線mongodb
db = client.photo #連線對應資料庫
#db.authenticate("username","passowd")
fs = GridFS(db, collection="images") #連線collection
num = 1
for grid_out in fs.find(no_cursor_timeout=True):
    data = grid_out.read() # 獲取圖片資料
    outf = open('/home/%d.jpg'%num,'wb')
    outf.write(data) #儲存圖片
    outf.close()
    if num%100000 == 0
        metadata_file = open("/home/metadata%d.csv"%(num/100000+1), "ab")
        csv_writer = csv.writer(metadata_file,delimiter='t')
    row = [grid_out.photo_title.encode('utf-8'), grid_out.uploadDate, grid_out.upload_date, 
        grid_out.longitude, grid_out.latitude, grid_out.width, grid_out.height,
        grid_out.owner_name.encode('utf-8'), grid_out.photo_id, grid_out._id, grid_out.photo_url]
    csv_writer.writerow(row)12345678910111213141516171819

bson二進位制

這種方法將圖片資料作為鍵值對放入字典與屬性資料作為整體存入資料庫中。 

上傳程式碼如下:

from bson import binary
from pymongo import MongoClient

client = MongoClient('127.0.0.1', 27017) #連線mongodb
db = client.photo #連線對應資料庫
image_collection = db.images
data = requests.get(dic["photo_url"], timeout=10).content
# 確認資料庫中不存在此圖片之後再儲存
if not image_collection.find_one({"photo_url":dic["photo_url"]})
    dic["imagecontent"] = binary.Binary(data)
    image_collection.insert(dic)1234567891011

推薦學習《》。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2834477/,如需轉載,請註明出處,否則將追究法律責任。

相關文章