python利用mongodb上传图片数据 : GridFS 与 bson两种方式
2018-02-06 15:53
597 查看
利用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" }
一、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
下载
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)
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)
相关文章推荐
- 利用Selenium实现图片文件上传的两种方式介绍
- 利用Selenium实现图片文件上传的两种方式
- python2.7+mongo3.0+gridfs从mongodb下载图片及属性数据
- ios 上传图片到服务器两种方式
- 利用GDAL读取图片,将数据以BIP的方式存在内存中。
- 基于MongoDB GridFS取二进制数据转换为图片在jsp页面显示
- python - 利用Pandas对某app数据进行整理、分析并存入mongodb
- 利用Python进行图片发送与接收的两种方法---包含客户端和服务器端代码
- 关于利用asi上传图片,服务器那边接收不到数据
- Java和PHP两种方式实现上传图片到新浪微博的图床
- Asp.Net HttpPostedFile和base64两种上传图片(文件)方式
- 详解IOS开发中图片上传时两种图片压缩方式的比较
- MPLS TE 利用PBR将数据引入隧道的两种方式
- Hibernate框架利用sessionFactory保存数据的两种方式
- 利用JQuery上传插件Uploadify实现图片上传MongoDB并预览
- 利用commons-fileupload 上传图片(包含表单数据)
- C# Python 读取txt中的文件,将16进制的数据按照小端方式排列,处理为有符号的数字,并写入text文件;控制台和界面两种方式
- 利用commons-fileupload 上传图片(包含表单数据)
- 利用 python 对文件夹下图片数据进行批量改名
- python的数据增强利用opencv读取图片