热门标签 | 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)


推荐阅读
  • 近期参与了一个旨在提高在线平台大规模查询响应速度的项目,预计处理的数据量为2-3亿条,数据库并发量约为每秒1500次,未来可能增至3000次。通过对比Redis和MongoDB,最终选择了MongoDB,因其具备优秀的横向扩展性和GridFS支持下的Map/Reduce功能。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 离线环境下的Python及其第三方库安装指南
    在项目开发中,有时会遇到电脑只能连接内网或完全无法联网的情况。本文将详细介绍如何在这种环境下安装Python及其所需的第三方库,确保开发工作的顺利进行。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • Mongoose 5.12.10 发布:MongoDB 异步对象模型工具的新特性与修复
    Mongoose 是一款专为异步环境设计的 MongoDB 对象模型工具,支持 Promise 和回调函数。最新版本 Mongoose 5.12.10 带来了多项修复和改进,包括查询选项中的默认值设置、嵌入式判别器填充、以及 TypeScript 定义文件的优化。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本文介绍了如何利用MongoDB的$exists操作符在Java应用程序中检查特定字段是否存在于文档中,包括示例代码和解释。 ... [详细]
  • 本文将介绍如何利用Python爬虫技术抓取国内主流在线学习平台的数据,并以51CTO学院为例,进行详细的技术解析和实践操作。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
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社区 版权所有