• python利用mongodb上传图片数据 : GridFS 与 bson两种方式


    利用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" : "https://farm2.staticflickr.com/1063/602880671_c2f4511ef4_b.jpg",
        "dateupload" : "1075355967",
        "owner_id" : "45365637@N00"
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    一、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.chunks
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    下载

    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='	')
        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)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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)

    --------------------- 本文来自 MoonBreeze_Ma 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_23926575/article/details/79271436?utm_source=copy 

  • 相关阅读:
    WC2020「Illusory」
    WC2015-2019
    Java基础——数组
    Java基础——Java基础语法和使用
    完善README——MarkDown模板[EN]
    完善README——MarkDown模板[CN]
    完善README——Markdown语法概要总结
    Java基础——Java如何导入本地项目
    Java基础——Java的历史以及平台应用
    AndroidSDK——和风天气使用初体验
  • 原文地址:https://www.cnblogs.com/ExMan/p/9712392.html
Copyright © 2020-2023  润新知