python 版本为2.7

mongodb版本2.6.5

使用mongodb存储文件,可以使用两种方式,一种是像存储普通数据那样,将文件转化为二进制数据存入mongodb,另一种使用gridfs,咱们先来说说第一种

先读取文件内容,然后塞进bson.binary.Binary对象里,最后像平常那样写入数据库,是不是很简单呢,获取文件一样的简单,像平时那样查找数据,然后将二进制内容写入文件即可

#coding=utf-8
'''
Created on 2015-10-8 @author: kwsy2015
'''
import pymongo
import bson.binary
from pymongo import MongoClient
from cStringIO import StringIO
def insertFile():
client = MongoClient('localhost', 27017)
#获得一个database
db = client.MongoFile
#获得一个collection
coll = db.image
filename = 'F:/测试数据/hehe.jpg'.decode('utf-8')
with open (filename,'rb') as myimage:
content = StringIO(myimage.read())
coll.save(dict(
content= bson.binary.Binary(content.getvalue()),
filename = 'hehe.jpg'
)) def getFile():
client = MongoClient('localhost', 27017)
#获得一个database
db = client.MongoFile
#获得一个collection
coll = db.image
data = coll.find_one({'filename':'hehe.jpg'})
out = open('F:/测试数据/test4.jpg'.decode('utf-8'),'wb')
out.write(data['content'])
out.close()
getFile()

因为我的文件路径都带有中文,因此需要用utf-8解码,否则会报错的

使用上述方法存储小文件是很方便的,那么如果是大文件呢,可以使用gridfs

gridfs会把文件分成若干块来存储,每一块的大小默认为256K,所以,如果是小文件,就不要用gridfs来存储了,不然会浪费空间的,gridfs是MongoDB之上的分布式文件系统,可以使用mongodb的分片和复制机制,因为Mongodb分配数据空间时以2GB为单位,所以gridfs不产生磁盘碎片。

#coding=utf-8
'''
Created on 2015-9-29 @author: Administrator
'''
from pymongo import MongoClient
from bson.objectid import ObjectId
from gridfs import *
def insertFile():
client = MongoClient('localhost', 27017)
db = client.Pic
fs = GridFS(db, 'images')
with open ('F:/测试数据/hehe.jpg'.decode('utf-8'),'rb') as myimage:
data=myimage.read()
id = fs.put(data,filename='first')
print id
def getFile():
client = MongoClient('localhost', 27017)
db = client.Pic
fs = GridFS(db, 'images')
file = fs.get_version('first', 0)
data = file.read()
out = open('F:/测试数据/test3.jpg'.decode('utf-8'),'wb')
out.write(data)
out.close()
def delFile():
client = MongoClient('localhost', 27017)
db = client.Pic
fs = GridFS(db, 'images')
fs.delete(ObjectId('560a531b0d4eae34a4edbfdd'))
def listName():
client = MongoClient('localhost', 27017)
db = client.Pic
fs = GridFS(db, 'images')
print fs.list()
listName()

写入文件时,我们可以设置它的filename,如果多个文件使用同一个filename呢,我们在获取文件时可以使用get_version()函数,第一个参数是filename,第二个参数是版本,从0开始。

此外,我们还可以使用get(),函数,需传入文件的ObjectId

使用python操作gridfs总得来说是很方便的,毕竟所提供的函数就那么几个,稍微用心看看源码就没问题了

转自:http://www.voidcn.com/blog/KWSY2008/article/p-4871553.html

mongodb存储二进制数据的二种方式——binary bson或gridfs的更多相关文章

  1. mongodb存储二进制数据

    mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...

  2. Android学习笔记(十二)——使用意图传递数据的几种方式

    使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...

  3. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  4. 讨论HTTP POST 提交数据的几种方式

    转自:http://www.cnblogs.com/softidea/p/5745369.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PU ...

  5. 使用 MongoDB 存储日志数据

    使用 MongoDB 存储日志数据     线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题 ...

  6. MongoDB 存储日志数据

    MongoDB 存储日志数据 https://www.cnblogs.com/nongchaoer/archive/2017/01/11/6274242.html 线上运行的服务会产生大量的运行及访问 ...

  7. SparkStreaming获取kafka数据的两种方式:Receiver与Direct

    简介: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以简单理解成: Receiver方式是通过zookeeper来连接kafka队列, Dire ...

  8. SparkStreaming与Kafka,SparkStreaming接收Kafka数据的两种方式

    SparkStreaming接收Kafka数据的两种方式 SparkStreaming接收数据原理 一.SparkStreaming + Kafka Receiver模式 二.SparkStreami ...

  9. 【代码笔记】iOS-向服务器传JSON数据的两种方式

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

随机推荐

  1. python--文件处理1

    1.     读取文件 方法: all_the_text = open('thefile.txt').read() 但是为了安全起见还是给打开的文件对象指定一个名字,这样在完成之后可以迅速关掉,防止无 ...

  2. -[__NSCFString longValue]: unrecognized selector sent to instance

    You can use NSString methods intValue longLongValue. 这个使用longvalue会crash报上面的错误

  3. 【GitHub】给GitHub上的ReadMe.md文件中添加图片怎么做 、 gitHub创建文件夹

    1.首先在github上的仓库上,创建一个空的文件夹,用于上传图片 上图看 要点击的按钮是创建新的文件,并不是创建新的文件夹,具体怎么?往下看 这个时候,下面的提交按钮才能提交 2.进入新创建的文件夹 ...

  4. c++中.dll与.lib文件的生成与使用的详解

    两种库: • 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.• 包含函数代码本身,在编译时 ...

  5. 轻松搞定RabbitMQ(四)——发布/订阅

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48729479 翻译地址:http://www.rabbitmq.com/tutorials ...

  6. ubuntu 安装后的配置

    osx 下用 vmware 安装了一个 ubuntu 虚拟机,版本是 14.04 server.安装完之后要做一系列配置,记录如下. 配置 Android 编译环境 sudo apt-get inst ...

  7. maven的坑: Exception in thread "pool-1-thread-1" java.lang.NoClassDefFoundError: org/eclipse/aether/spi/connector/Transfer$State

    搭建ReboletricSample的环境: 搭建完成,执行的时候报错: Exception in thread "main" java.lang.NoClassDefFoundE ...

  8. Oracle比较时间大小

    1,比较当前时间与指定时间相差分钟数:    select sysdate,  sysdate - to_date('2007-04-03 13:45:39','yyyy-mm-dd hh24:mi: ...

  9. 图像处理之opencv---常用函数

    http://blog.sina.com.cn/s/blog_9c3fc0730100yzwt.html 很全 http://www.xuebuyuan.com/593449.html cvrepea ...

  10. Android UI经常使用实例 怎样实现欢迎界面(Splash Screen)

    在Android平台下.下载一个应用后,首次打开映入眼帘的便是Splash Screen,暂且不说Android的设计原则提不提倡这样的Splash Screen.先来看看一般使用Splash Scr ...