zoukankan      html  css  js  c++  java
  • 使用GridFS上传下载图片以及其他文件

      MongoDB所带的GridFS是极为方便的文件管理系统,MongoDB的Shell语言与Python的语言风格非常像,写起来非常方便。重点是需要用StringIO将文件装换为二进制保存。主程序是一个同步图片的小范例。

    #encoding=utf-8
    import sys
    
    if sys.getdefaultencoding() != 'utf-8':
        reload(sys)
        sys.setdefaultencoding('utf-8')
    __author__ = 'lxc'
    
    import pymongo
    from gridfs import *
    from PIL import Image
    import StringIO
    import os
    
    #文件处理系统
    class GFS:
        def __init__(self, db):
            self.myFs = GridFS(db, 'images')
    
    
        #写入
        def put(self, file_path):
            gf = None
            try:
                data = StringIO.StringIO()
                image = Image.open(file_path)
                form = image.format
                image.save(data, form)
                gf = self.myFs.put(data.getvalue(), filename=file_path.split('\\')[-1], format=form)
            except Exception as e:
                print  e
            finally:
                return gf
    
    
        #获得
        def get(self, name):
            gf = None
            try:
                gf=self.myFs.get_version(name)
                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,path=None):
            path=path+dic['name']
            if path:
                output = open(path, 'wb')
                output.write(data)
                output.close()
    
        #获得文件列表
        def list(self):
            return self.myFs.list()
    
        #删除文件
        def remove(self, name):
            self.myFs.remove(name)
    
    
    if __name__ == '__main__':
            #DEMO:上传下载源文件目录下的image文件夹
        client = pymongo.MongoClient()
        db = client.test
        gfs = GFS(db)
        local_image_path = os.getcwd() + "\\image\\"
        if not os.path.exists(local_image_path):
            os.makedirs(local_image_path)
        local_pic_lists = os.listdir(local_image_path)
        remote_pic_lists = gfs.list()
        up = 0
        for local_pic in local_pic_lists:
            if local_pic not in remote_pic_lists:
                gfs.put(local_image_path + local_pic)
                up += 1
        down = 0
        for remote_pic in remote_pic_lists:
            if remote_pic not in local_pic_lists:
                (data, dic) = gfs.get(remote_pic)
                gfs.write_2_disk(data, dic, local_image_path)
                down += 1
        print up, down
    
  • 相关阅读:
    mac 打开文件路径
    js 小技巧
    java 随机数
    sql server 2000 按日期查找
    WML
    Groovy
    Windows Azure Traffic Manager (4) Windows Azure Traffic Manager (4) 循环法和故障转移
    Windows Azure Cloud Service (28) 在Windows Azure发送邮件(中)
    [New Portal] Windows Azure Cloud Service (30) 新的Windows Azure SDK 1.7和新的Windows Azure Managemeng Portal
    Windows Azure Traffic Manager (3) Windows Azure Traffic Manager (3) 创建流量管理器策略和性能负载平衡
  • 原文地址:https://www.cnblogs.com/leisurely/p/3390929.html
Copyright © 2011-2022 走看看