利用mongodb保存图片通常有两种方法,一种是将图片数据转化为二进制作为字典的键值对进行保存,另一种是利用mongodb提供的GridFS进行保存,两者各有利弊。性能方面的优劣未曾测试,无法进行评价,此处仅对两种方式进行介绍,若有彻知者还望指教。
下面以如下数据作为示例进行介绍:
数据示例

  1. dic = {
  2. "owner_name" : "samssmilin",
  3. "photo_id" : "602880671",
  4. "tags" : "",
  5. "longitude" : "-121.106479",
  6. "height" : "766",
  7. "datetaken" : "2004-01-17 21:05:35",
  8. "width" : "1024",
  9. "length" : 38141,
  10. "photo_title" : "Dad and Elijah",
  11. "latitude" : "35.565222",
  12. "photo_url" : "https://farm2.staticflickr.com/1063/602880671_c2f4511ef4_b.jpg",
  13. "dateupload" : "1075355967",
  14. "owner_id" : "45365637@N00"
  15. }
  • 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合并为图片数据。
上传

  1. from pymongo import MongoClient
  2. from gridfs import *
  3. import requests
  4. client = MongoClient('127.0.0.1', 27017) #连接mongodb
  5. db = client.photo #连接对应数据库
  6. #db.authenticate("username","passowd")
  7. fs = GridFS(db, collection="images") #连接collection
  8. data = requests.get(dic["photo_url"], timeout=10).content
  9. # 确认数据库中不存在此图片之后再保存
  10. if not fs.find_one({"photo_url":dic["photo_url"]}):
  11. fs.put(data, **dic)
  12. # 上传成功后,photo数据库下出现两个collection,分别为: images.files, images.chunks
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

下载

  1. from pymongo import MongoClient
  2. from gridfs import *
  3. client = MongoClient('127.0.0.1', 27017) #连接mongodb
  4. db = client.photo #连接对应数据库
  5. #db.authenticate("username","passowd")
  6. fs = GridFS(db, collection="images") #连接collection
  7. num = 1
  8. for grid_out in fs.find(no_cursor_timeout=True):
  9. data = grid_out.read() # 获取图片数据
  10. outf = open('/home/%d.jpg'%num,'wb')
  11. outf.write(data) #存储图片
  12. outf.close()
  13. if num%100000 == 0
  14. metadata_file = open("/home/metadata%d.csv"%(num/100000+1), "ab")
  15. csv_writer = csv.writer(metadata_file,delimiter='\t')
  16. row = [grid_out.photo_title.encode('utf-8'), grid_out.uploadDate, grid_out.upload_date, \
  17. grid_out.longitude, grid_out.latitude, grid_out.width, grid_out.height,\
  18. grid_out.owner_name.encode('utf-8'), grid_out.photo_id, grid_out._id, grid_out.photo_url]
  19. csv_writer.writerow(row)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

bson二进制

这种方法将图片数据作为键值对放入字典与属性数据作为整体存入数据库中。
上传代码如下:

  1. from bson import binary
  2. from pymongo import MongoClient
  3. client = MongoClient('127.0.0.1', 27017) #连接mongodb
  4. db = client.photo #连接对应数据库
  5. image_collection = db.images
  6. data = requests.get(dic["photo_url"], timeout=10).content
  7. # 确认数据库中不存在此图片之后再保存
  8. if not image_collection.find_one({"photo_url":dic["photo_url"]})
  9. dic["imagecontent"] = binary.Binary(data)
  10. 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. cssnext下一代的css

    前端技术更新迭代的速度令人咂舌,互联网+的风头刚起那几年,前端技术大多还停留在jquery阶段,按需加载还停留在seajs和requirejs的阶段,css3和H5也不过才崭露头角,但经过几年的飞速发 ...

  2. 树莓派学习笔记——I2C设备载入和速率设置

    原文:http://blog.csdn.net/xukai871105/article/details/18234075 1.载入设备 方法1——临时载入设备 sudo modprobe -r i2c ...

  3. 社会信息化环境下的IT新战略

    我们现在所处的信息化环境正在发生改变,技术已经成为影响组织的最重要的外部力量,传统的正金字塔的结构被移动互联网深深改变:员工能够更加自由的获取信息,变成更多的信息链接,这种链接不光连接人和组织,还连接 ...

  4. TongWeb

    TongWeb 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 作为国内领先的中间件开发商,是国内最早研究J2EE技术和开发应用服务器产品的厂商.应用服务器TongWe ...

  5. maven删除不必要的依赖;优化pom依赖研究

    mvn dependency:copy-dependencies -DoutputDirectory=/home/admin/git/oceanus/test 会把所有依赖的插件版本都拷贝进去,而不是 ...

  6. Android 支付宝快捷支付集成及ALI64错误的有效解决

    支付宝开放平台採用了RSA安全签名机制,开发人员能够通过支付宝公钥验证消息来源.同一时候可使用自己的私钥对信息进行加密. RSA算法及数字签名机制是支付宝开放平台与开发人员网关安全通信的基础.若开发人 ...

  7. vijos1308 埃及分数(迭代加深搜索)

    题目链接:点击打开链接 题目描写叙述: 在古埃及.人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不同意2/3=1/3+1/3,由于加数中有同样的.对于 ...

  8. binary-tree-postorder-traversal——二叉树后续遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  9. bootstrap之ScrollTo

    ScrollTo package io.appium.android.bootstrap.handler; import com.android.uiautomator.core.UiObject; ...

  10. com.sun.jdi.InvocationException occurred invoking method 异常

    参考链接:https://stackoverflow.com/questions/4123628/com-sun-jdi-invocationexception-occurred-invoking-m ...