利用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 gridfs_python利用mongodb上传图片数据 : GridFS 与 bson两种方式相关推荐

  1. ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约

    ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约 目录 1.Geth安装.配置文件.与ETH节点交互 1.1.下载并安装好geth客户端 1.2. ...

  2. MySQL数据导入导出的两种方式

    文章目录 前言 一.使用Navicat Premium数据库可视化工具的企业管理器导入导出数据 1.企业管理器导入步骤: 2.企业管理器导出步骤: 二.cmd方式导入导出数据 1.cmd导入步骤: 2 ...

  3. 数据归一化处理的两种方式

    数据归一化处理的两种方式 import pandas as pd import numpy as np test_data = pd.DataFrame([[1,1,1],[2,2,2],[3,3,3 ...

  4. jsp页面数据加载的两种方式

    JSP数据加载的两种方式 第一种: 三层架构写在controller的页面跳转前面,set到request域中 request.setAttribute("name", list) ...

  5. 利用反射机制创建新类的两种方式及比较

    [0]README 0.1) 本文描述+源代码均 转自 http://blog.csdn.net/fenglibing/article/details/4531033 , 旨在深入理解 如何利用反射机 ...

  6. springboot项目中利用@WebFilter注解和@Bean配置类两种方式实现Filter过滤器

    过滤器(Filter) 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理.通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 ...

  7. 关于利用qrcode生成二维码的两种方式的区别

    首先以下内容是查找网上资料后了解的利用qrcode.js生成二维码的额两种方式,canvas(即画布)方式和table方式(原文地址http://www.helloweba.com/view-blog ...

  8. 【华为云技术分享】云小课 | 迁移第三方云厂商数据至OBS,两种方式任你选

    如何将我在第三方云厂商对象存储上的数据迁移至华为云OBS?华为云主要提供对象存储迁移服务(Object Storage Migration Service,OMS)和云数据迁移(Cloud Data ...

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

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

最新文章

  1. MySQL—用户和权限管控
  2. html雪碧图效果,html和css中雪碧图的使用
  3. if条件的默认转换规则:
  4. redhat7挂载光盘
  5. 医库软件-珍立拍 成功晋级黑马大赛总决赛
  6. 单模光纤最大传输距离为多少_单模光缆的传输距离是多少?
  7. Java程序员面试时,如何进行自我介绍呢?
  8. 人体反应测试仪 c语言,FD.12-FD-HRT-A
  9. php 将格式化时间转化为时间戳 以及数据库中将格式化时间转化为时间戳
  10. 如何发现网站被劫持被黑DNS被污染
  11. 静态路由——手写路由表及综合实验
  12. Android面试总结(持续更新修改)
  13. uefi装完系统后无法引导_uefi装win7启动不了怎么解决?
  14. dreamweaver快捷键大全
  15. 批量提取CAD中文字
  16. 初中计算机word试题,初中计算机会考word试题WORD15
  17. MUMU模拟器设置网络
  18. iOS“伪后台“机制下如何保持APP一直运行在后台
  19. core文件处理和进程查询
  20. 【Echarts】关于关闭点击地图时显示黄色的方法

热门文章

  1. 数据库误操作,如何恢复数据(SQL事务,或数据库还原)
  2. Sublime Merge
  3. 披萨店小程序_比萨问题–建造者与装饰者
  4. 欧创芯OC5800L 2A 90V ESOP8 内置MOS 降压恒压贴片IC 平衡车扭扭车IC方案
  5. 统计检验(一)// 方差分析
  6. Android 查找最近的可以获取焦点的控件(一) 指明控件下一个查找属性的查找
  7. 【笔记】Ueditor1_4_3_3-utf8-jsp使用步骤
  8. 小觅相机的相机标定全家桶(相机IMU,相机内参,相机外参)
  9. 【空气质量数据分析专题七】污染物浓度月变化分析
  10. PyCharm Database serverTimezone