将gridFS中的图片文件写入硬盘
开启用户验证下的gridfs 连接使用,在执行脚本前可以在python shell中
from pymongo import Connection
from gridfs import *
con = Connection("mongodb://admin:admin@127.0.0.1:27017")#用URI的方式建立数据库的链接,当然也有其他的方式进行授权,现在是mongodb的管理员帐号,普通帐号不知道为什么不可以,
db = con['repository']#连接到具体的数据库
fs = gridfs.GridFS(db, 'images')#连接到collection,不存在的话会进行创建
fs.put('data.txt')
ObjectId('50b8176989ee3209bccb0b542881064151')#shell 返回文件在mongodb中的id,此时该数据库中会新建两个集合,images.chunk 和images.files
其中关于ObjectId的导入问题
在pymongo 2.2版本一下需要从pymongo.objectid中导入
在2.2及以上版本中从bson.objectid 中导入
Python 脚本如下
__author__ = 'jiangyt'
#encoding=utf-8
from pymongo import Connection
from gridfs import *
from PIL import Image
from bson.objectid import ObjectId
import StringIO
import threading, time
#文件处理系统
class GFS:
#定义connection and fs
c = None
db = None
fs = None
instance = None
locker = threading.Lock()
@staticmethod
def _connect():
if not GFS.c:
GFS.c = Connection( "mongodb://admin:admin@127.0.0.1:27017") # 建立mongodb的连接
GFS.db = GFS.c['maidiansha'] #连接到指定的数据库中
GFS.fs = GridFS(GFS.db, collection='images') #连接到具体的collection中
#初始化
def __init__(self):
print "__init__"
GFS._connect()
print "server info " + " * " * 40
print GFS.c.server_info
#获得单列对象
@staticmethod
def getInstance():
GFS.locker.acquire()
try:
GFS.instance
if not GFS.instance:
GFS.instance = GFS()
return GFS.instance
finally:
GFS.locker.release()
#写入
def put(self, name, format="png",mime="image"):
gf = None
data = None
try:
data = StringIO.StringIO()
name = "%s.%s" % (name,format)
image = Image.open(name)
image.save(data,format)
#print "name is %s=======data is %s" % (name, data.getvalue())
gf = GFS.fs.put(data.getvalue(), filename=name, format=format)
except Exception as e:
print "Exception ==>> %s " % e
finally:
GFS.c = None
GFS._connect()
return gf
#获得图片
def get(self,id):
gf = None
try:
gf = GFS.fs.get(ObjectId(id))
im = gf.read() #read the data in the GridFS
dic = {}
dic["chunk_size"] = gf.chunk_size
dic["metadata"] = gf.metadata
dic["length"] = gf.length
dic["upload_date"] = gf.upload_date
dic["name"] = gf.name
dic["content_type"] = gf.content_type
dic["format"] = gf.format
return (im , dic)
except Exception,e:
print e
return (None,None)
finally:
if gf:
gf.close()
#将gridFS中的图片文件写入硬盘
def write_2_disk(self, data, dic):
name = "./get_%s" % dic['name']
if name:
output = open(name, 'wb')
output.write(data)
output.close()
print "fetch image ok!"
#获得文件列表
def list(self):
return GFS.fs.list()
#删除文件
def remove(self,name):
GFS.fs.remove(name)
if __name__== '__main__':
image_name= raw_input("input the image name>>")
if image_name: www.codesec.net
gfs = GFS.getInstance()
if gfs:
image_id = gfs.put(image_name)
print "==========Object id is %s and it's type is %s==========" % (image_id , type(image_id))
(data, dic) = gfs.get(ObjectId(image_id))
gfs.write_2_disk(data, dic)
将gridFS中的图片文件写入硬盘的更多相关文章
- WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片
原文:WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片 1.图片文件转换成Visual对象 private Visual CreateVisual(string imag ...
- Aspose.Words提取word文档中的图片文件
/// <summary> /// 提取word中的图片 /// </summary> /// <param name="filePath">w ...
- mongodb中获取图片文件<标记>
获取图片文件 @RequestMapping(value="/downLoadFileFormMongo.do",method=RequestMethod.GET) @Respon ...
- linux下,将一个目录中的图片文件合成为gif图片
# {} 为文件所在目录位置 # {} 为gif图片位置 convert -delay -depth -layers optimize -quality -loop {} {}
- Java中对图片文件的类型的获取
public static void main(String[] args) { File f = new File("c://test.jpg"); ...
- 将raw里面的数据库文件写入到data中
package com.city.list.db; import java.io.File; import java.io.FileNotFoundException; import java.io. ...
- [转] 从数据库中读取图片并导入Excel文件,C#方式
原文地址, 作者 Lvyou1980 直接源码吧. using System; using System.IO; using System.Data; using System.Drawing; us ...
- 利用FlashPaper在web页面中显示PDF文件(兼容各浏览器)
应项目需求要把PDF内嵌到网页中显示,其中有了很多办法,比如用<embed/>元素放入PDF文件,但是效果不理想,浏览器兼容不理想,在ie9/8(其他版本没有测试)显示会提示下载pdf文件 ...
- Java中显示图片的方法
最近在做一个swing小项目,其中需要把存储在硬盘中的图片文件显示出来,总结了如下方法: 1. Graphics g = getGraphics();String name = "E:/Ca ...
随机推荐
- Liferay 6.2 改造系列之五:修改默认站点的页面内容
相关页面可以通过/portal-master/portal-impl/src/portal.properties文件配置进行修改: 登录页: ## ## Default Landing Page ## ...
- git学习 分支特殊处理和配置03
Bug分支: 当在一个分支上工作的时候:突然到其它分支修复bug,当前分支工作还没到要提交的程度:这时候可以使用git stash来将工作分支暂时存储起来: 用git stash list查看stas ...
- TestNg线程池配置、执行次数配置、超时配置
使用注解的方式对TestNg线程池配置.执行次数配置.超时配置 注:使用注解来控制测试方法运行的次数和超时时间,timeOut在单线程或者多线程模式下都可用,threadPoolSize设置了线程池的 ...
- http://blog.csdn.net/jyw935478490/article/details/51233931
http://blog.csdn.net/jyw935478490/article/details/51233931
- Block与代理的使用
本人其实是比较喜欢用Block的,因为用block写出来的代码,让我感觉代码要紧凑一些,看起来的时候,思路要清晰些,所以这估计也就是现在block将要代替代理的原因所在吧! 下面,直接进入主题: 一. ...
- Redis开启持久化
配置appendonly 打开redis.conf找到appendonly. 将 appendonly no 改为 appendonly yes 配置appendfsync appendfsync a ...
- 《Getting Started with Storm》译文 Homepage
拿到这本书感觉还挺薄,所以当下就想赶紧读完,然后尝试着翻译下,并加上一些自己的理解,作学习交流之用,非盈利性质 这段时间在做一个 分布式的.支持大吞吐的.实时的日志系统 ,主要用到的开源方案有Kaf ...
- underscore.js依赖库函数分析一(遍历)
Underscore简介: underscore是一个非常简洁,实用的javascript库,和jQuery封装类型差不多,但underscore是backbone的依赖 库,想运行backbone就 ...
- BZOJ4428 : [Nwerc2015]Debugging调试
设$f[i]$为最优策略下调试$i$行代码的时间,则: $f[1]=0$ $f[i]=\min((j-1)\times p+f[\lceil\frac{i}{j}\rceil])+r$ 意义为枚举pr ...
- node.js 实现一个简单的登录拦截器
拦截器在web开发中随处可见,比如站点的管理后台,不说所有人都能进入,所以就需要做一个拦截器并友好的跳转到提示页. 下面我们简单实现一种,判断用户是否登录成功,登录不成功的用户自动重定向到登录页面. ...