热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python2.6.2+MongoDB2.0.7+GridFS实现图片的存取

开启用户验证下的gridfs连接使用,在执行脚本前可以在pythonshell中frompymongoimportConnectionfromgridfsimport*conConnection(mongodb://admin:admin@127.0.0.1:27017)#用URI的方式建立数据库的链接,当然也有其他的

开启用户验证下的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('50b8176989ee3209bccb0b54')#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: 
           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)


推荐阅读
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文探讨了Python类型注解使用率低下的原因,主要归结于历史背景和投资回报率(ROI)的考量。文章不仅分析了类型注解的实际效用,还回顾了Python类型注解的发展历程。 ... [详细]
  • 本文将详细探讨 Python 编程语言中 sys.argv 的使用方法及其重要性。通过实际案例,我们将了解如何在命令行环境中传递参数给 Python 脚本,并分析这些参数是如何被处理和使用的。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 第一步java代码条件匹配与之对应的mongo数据查询第二步:java代码分组查询与之所对应的mongodb中sheel与所得出的表点击某个_id字段进入,所得出的图表为第三步:在 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本文探讨了实现类似滴滴出行的实时位置推送的技术方案,包括LBS服务和消息推送服务的架构设计。 ... [详细]
  • 本文将详细介绍如何在 MongoDB 中实现不区分大小写的查询,包括使用正则表达式和转换字段值的方法。希望通过本文的介绍,读者能够掌握这些技巧并应用于实际项目中。 ... [详细]
author-avatar
安晗夕Brooke
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有