zoukankan      html  css  js  c++  java
  • 将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)

  • 相关阅读:
    Java生产者与消费者(下)
    Java生产者与消费者(上)
    Java中的继承和接口
    syslog(),closelog()与openlog()--日志操作函数
    Nagle算法
    TCP_NODELAY详解
    Linux "零拷贝" sendfile函数中文说明及实际操作分析
    pdflush的工作原理
    proc/sys/net/ipv4/下各项的意义
    求最低价格
  • 原文地址:https://www.cnblogs.com/cbryge/p/6155275.html
Copyright © 2011-2022 走看看