利用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='\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)
  • 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

python利用mongodb上传图片数据 : GridFS 与 bson两种方式的更多相关文章

  1. Android提交数据到服务器的两种方式四种方法

    本帖最后由 yanghe123 于 2012-6-7 09:58 编辑 Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方 ...

  2. mysql导出数据到excel的两种方式

    使用第一种方式如果数据中有换行符的话会自动换行,但使用第二种方式就不会出现这种效果了.两种方式自己选择哈 1:select * from into outfile 'c:/Users/a.xls' t ...

  3. python 之 并发编程(开启子进程的两种方式,进程对象的属性)

    第九章并发编程 同一个程序执行多次是多个进程 import time import os ​ print('爹是:',os.getppid()) #父进程PID,(pycharm) print('me ...

  4. 利用"SQL"语句自动生成序号的两种方式

    1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[id] fro ...

  5. 利用"SQL"语句自动生成序号的两种方式

    1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[name] f ...

  6. Java导出数据为EXCEL的两种方式JXL和POI

    JXL和POI导出数据方式的比较 POI支持excel2003和2007,而jxl只支持excel2003. 下面为测试代码: public class TestCondition { /** * 生 ...

  7. python flask学习第2天 URL中两种方式传参

    新创建项目   自己写个url映射到自定义的视图函数 在url中传递参数 app.py from flask import Flask app = Flask(__name__) @app.route ...

  8. java分段加载数据,循环和递归两种方式

    package org.jimmy.autosearch2019.test; import java.util.ArrayList; public class Test20190328 { priva ...

  9. 前端传递数据到后台的两种方式;创建一个map或者创建一个FormData对象

    一.构建一个map getAllDeptAllUsers(){ const modleCode = {'auditMenuId': this.auditMenuId, 'enterpriseId': ...

随机推荐

  1. usaco feb04距离咨询

    [USACO FEB04]距离咨询 成绩   开启时间 2014年09月19日 星期五 10:08 折扣 0.8 折扣时间 2014年09月26日 星期五 10:08 允许迟交 是 关闭时间 2014 ...

  2. 数字巨头们的表态--<大佬与大话>

    作者魏武挥 类别非虚构 / 中篇 本书为作者为<21世纪商业评论>的专栏文章合集,共20篇,算是第一卷吧,后期还会写下去.这个专栏的名字叫<大佬与大话>,专门收集TMT圈子商业 ...

  3. 使用SourceTree 来管理 Gitcafe 的Pages 发布Blog!

    有个好爹的 SourceTree 是来自 JIRA 的娘家 Bitbucket 的新东家 ATLASSIAN.com 一家成功的,对敏捷软件工程拥有全栈式支持的商业公司, 所推出的 MAC 专用, S ...

  4. 使用uilabel重新自调整高度后显示横线和竖线问题

    这个使用uilabel自调节高度发现的问题,代码如下: //content label                        NSString *contentValue = ((Messag ...

  5. Sentinel实现Redis高可用

    实现目标: 一主两从,集群起始VIP在master上边,如果当前master挂了,sentinel自动选出一个slave当选master,并把VIP漂移到这台机器,然后把另一台slave指向的mast ...

  6. ZOJ ACM 1314(JAVA)

    昨天做了几个题目.过于简单,就不在博客里面写了. 1314这道题也比較简单,写出来是由于我认为在这里有一个小技巧,对于时间复杂度和空间复杂度都比較节省. 这个题目类似哈希表的求解.可是更简单.刚拿到题 ...

  7. linux下查看网卡信息的命令

    rhel 内核版本号信息: [root@hvrhub ~]# uname -a Linux hvrhub 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2 ...

  8. 浅析怎样学好C语言

    今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生.都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了全部的数字化信息,不论是一段程序,一封email.一部电影都是用一连串的 ...

  9. Oracle创建JOB定时任务

    --- DECLARE JOB NUMBER;BEGIN      DBMS_JOB.SUBMIT(          JOB=>JOB,          WHAT=>'CTABLE_T ...

  10. c#中的多态 c#中的委托

    C#中的多态性          相信大家都对面向对象的三个特征封装.继承.多态很熟悉,每个人都能说上一两句,但是大多数都仅仅是知道这些是什么,不知道CLR内部是如何实现的,所以本篇文章主要说说多态性 ...