精华内容
下载资源
问答
  • 我输入命令: pip install gridfs 提示: Could not find any downloads that satisfy the requirement gridfs No distributions at all found for gridfs
  • MongoDB内置一套文件系统名为GridFS(Grid File System),我们可以使用它来存储大于16M的文件。 GridFS具有分布式管理文件的能力,可以突破一般文件系统对file的限制,分段存储,不像普通文件系统是整个存储的。...

    问题引入:

    mongodb如何存取图片及等其他非文档型文件,或者说大于16M的文件。例如pdf文件,大图片文件等。

    解决方案

    MongoDB内置一套文件系统名为GridFS(Grid File System),我们可以使用它来存储大于16M的文件。

    GridFS具有分布式管理文件的能力,可以突破一般文件系统对file的限制,分段存储,不像普通文件系统是整个存储的。这样读取大型文件时就不会占用大量的内存。

    GridFS会将文件存储在两个Document里:

    1.Chunks用来存储二进制数据
    2.Files用于存储基本文件信息

    在这里插入图片描述

    gridfs介绍

    GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),适合于不常改变但是经常需要连续访问的大文件。GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。

    GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。

    其中,files中存储文件的元信息,默认使用集合为fs.files,键定义如下:

    _id 主键
    length 文件所包含的字节数
    chunkSize 组成文件的每个块的大小,单位为字节,默认值为256KB,可调整
    uploadDate 文件被上传到GridFS的日期
    md5 文件内容的MD5校验值,该值由服务器端测试得到
    

    在这里插入图片描述

    每一个文件存储的各个chunk的files_id相同
    在这里插入图片描述

    代码演练

    import pymongo
    from gridfs import GridFS
    from bson.objectid import ObjectId
    
    
    class MongoGridFS(object):
        UploadCache = "uploadcache"
        dbURL = "mongodb://192.168.20.120:27010"
    
        def __init__(self, params):
            '''
            Constructor
            '''
            # 上传文件
    
        def upLoadFile(self, file_coll, file_name, data_link):
            """
            上传文件
            :param file_coll: 集合名
            :param file_name: 文件名(自定义属性字段)
            :param data_link: 文件链接(自定义属性字段)
            :return: 返回files_id
            """
            client = pymongo.MongoClient(self.dbURL)
    
            db = client["xddq_device_maintenance"]
    
            filter_condition = {"filename": file_name, "url": data_link, 'version':2}
            gridfs_col = GridFS(db, collection=file_coll)
            file_ = "0"
            query = {"filename": ""}
            query["filename"] = file_name
    
            if gridfs_col.exists(query):
                print('已经存在该文件')
            else:
    
                with open(file_name, 'rb') as file_r:
                    file_data = file_r.read()
                    file_ = gridfs_col.put(data=file_data, **filter_condition)  # 上传到gridfs
    
                    print(file_)
    
            return file_
            # 按文件名获取文档
    
        def downLoadFile(self, file_coll, file_name, out_name, ver=-1):
            """
            按文件名下载
            :param file_coll:集合名
            :param file_name:文件名
            :param out_name: 下载下来的文件名
            :param ver: 版本号,默认-1表示最近一次的记录
            :return:
            """
            client = pymongo.MongoClient(self.dbURL)
    
            db = client["xddq_device_maintenance"]
    
            gridfs_col = GridFS(db, collection=file_coll)
    
            file_data = gridfs_col.get_version(filename=file_name, version=ver).read()
    
            with open(out_name, 'wb') as file_w:
                file_w.write(file_data)
    
        # 按文件_Id获取文档
        def downLoadFilebyID(self, file_coll, _id, out_name):
            """
            按文件id获取文件
            :param file_coll: 集合名
            :param _id: 文件id ===> fiels_id
            :param out_name: 下载后的文件名称
            :return: 
            """
            client = pymongo.MongoClient(self.dbURL)
    
            db = client["xddq_device_maintenance"]
    
            gridfs_col = GridFS(db, collection=file_coll)
    
            O_Id = ObjectId(_id)
    
            gf = gridfs_col.get(file_id=O_Id)
            file_data = gf.read()
            with open(out_name, 'wb') as file_w:
                file_w.write(file_data)
    
            return gf.filename
    
    
    if __name__ == '__main__':
        a = MongoGridFS("")
        file = a.upLoadFile("test","a.pdf","")  # 上傳名为a.pdf的文件
        a.downLoadFile("test","a.pdf","c.pdf")  # 按文件名下载文件保存到c.pdf
        ll = a.downLoadFilebyID("test", 'file', "b.pdf")  # 按files_id下载文件保存到b.pdf
    
    结果:

    在这里插入图片描述

    展开全文
  • from gridfs import GridFS class GFS(object): def __init__(self, file_db, file_table): self.file_db = file_db self.file_table = file_table def createDB(self): # 连接数据库,并创建文件数据库与数据...
    from pymongo import MongoClient
    from gridfs import GridFS
    
    class GFS(object):
        def __init__(self, file_db, file_table):
            self.file_db = file_db
            self.file_table = file_table
    
        def createDB(self):  # 连接数据库,并创建文件数据库与数据表
            client = MongoClient('localhost', 27017)
            db = client[self.file_db]
            file_table = db[self.file_table]
            return (db, file_table)
    
        def insertFile(self, db, filePath, query):  # 将文件存入数据表
            fs = GridFS(db, self.file_table)
            if fs.exists(query):
                print('已经存在该文件')
            else:
                with open(filePath, 'rb') as fileObj:
                    data = fileObj.read()
                    ObjectId = fs.put(data, filename=filePath.split('/')[-1])
                    print(ObjectId)
                    fileObj.close()
                return ObjectId
    
        def getID(self, db, query):  # 通过文件属性获取文件ID,ID为文件删除、文件读取做准备
            fs = GridFS(db, self.file_table)
            ObjectId = fs.find_one(query)._id
            return ObjectId
    
        def getFile(self, db, id):  # 获取文件属性,并读出二进制数据至内存
            fs = GridFS(db, self.file_table)
            gf = fs.get(id)
            bdata = gf.read()  # 二进制数据
            attri = {}  # 文件属性信息
            attri['chunk_size'] = gf.chunk_size
            attri['length'] = gf.length
            attri["upload_date"] = gf.upload_date
            attri["filename"] = gf.filename
            attri['md5'] = gf.md5
            print(attri)
            return (bdata, attri)
    
        # def listFile(self,db): #列出所有文件名
        #     fs = GridFS(db, self.file_table)
        #     gf = fs.list()
    
        # def findFile(self,db,file_table): #列出所有文件二进制数据
        #     fs = GridFS(db, table)
        #     for file in fs.find():
        #         bdata=file.read()
    
        def write_2_disk(self, bdata, attri):  # 将二进制数据存入磁盘
            name = "get_" + attri['filename']
            if name:
                output = open(name, 'wb')
            output.write(bdata)
            output.close()
            print("fetch image ok!")
    
        def remove(self, db, id):  # 文件数据库中数据的删除
            fs = GridFS(db, self.file_table)
            fs.delete(id)  # 只能是id
    
    
    if __name__ == '__main__':
        gfs = GFS('fileDB', 'fileTable')
        (file_db, fileTable) = gfs.createDB()  # 创建数据库与数据表
        filePath = 'C:/Users/Administrator/Desktop/02655.jpeg'  # 插入的文件
        query = {'filename': '02655.jpeg'}
        id = gfs.insertFile(file_db, filePath, query)  # 插入文件
        id = gfs.getID(file_db, query)
        (bdata, attri) = gfs.getFile(file_db, id)  # 查询并获取文件信息至内存
        gfs.write_2_disk(bdata, attri)  # 写入磁盘
        gfs.remove(file_db,id) #删除数据库中文件
    
    展开全文
  • Python 实现MongoDB Gridfs图片存取

    千次阅读 2019-03-20 10:27:19
    Python 实现MongoDB Gridfs图片存取 Gridfs官方文档链接:http://api.mongodb.com/python/current/api/gridfs/index.html?highlight=gridfs#module-gridfs # -*- coding:utf-8 -*- from gridfs import GridFS ...

     Python 实现MongoDB Gridfs图片存取

    Gridfs官方文档链接:http://api.mongodb.com/python/current/api/gridfs/index.html?highlight=gridfs#module-gridfs

    # -*- coding:utf-8 -*-
    
    from gridfs import GridFS
    from pymongo import MongoClient
    import urllib
    import os
    
    
    def write_file(data_host='localhost', data_db='gridfs_check', data_col='pic', file_name=None, data_link=None):
        """
        上传图片到MongoDB Gridfs
        :param data_host mongodb 服务器地址
        :param data_db: 数据库地址
        :param data_col:集合
        :param file_name: (图片)文件名称
        :param data_link: (图片)原始链接
        :return:
        """
        the_db = MongoClient(data_host).get_database(data_db)
        gridfs_col = GridFS(the_db, collection=data_col)
        filter_condition = {"filename": file_name, "url": data_link}
    
        """下载图片到本地后上传到MongoDB Gridfs后删除本地文件"""
        urllib.urlretrieve(data_link, "%s" % file_name)  # 将图片下载到本地
        with open("%s".decode('utf-8') % file_name, 'rb') as my_image:
            picture_data = my_image.read()
            file_ = gridfs_col.put(data=picture_data, **filter_condition)  # 上传到gridfs
            print file_
            my_image.close()
    
            os.remove("%s" % file_name)  # 删除本地图片
    
    
    def read_data(data_host='localhost', data_db='gridfs_check', data_col='pic', file_name=None):
        """
        从MongoDB Gridfs下载图片
        :param data_host mongodb 服务器地址
        :param data_db: 数据库地址
        :param data_col:集合
        :param file_name: (图片)文件名称
        :return:
        """
        the_db = MongoClient(data_host).get_database(data_db)
        gridfs_col = GridFS(the_db, collection=data_col)
        data = gridfs_col.get_version(filename=file_name, version=0).read()
        # print data
        out = open(('F:/%s' % file_name).decode('utf-8'), 'wb')   # .decode('utf-8')
        out.write(data)
        out.close()
    
    
    if __name__ == "__main__":
        link = "https://media.licdn.com/dms/image/C4E03AQGhU6VJLcn9xA/profile-displayphoto-shrink_800_800/0?e=1558569600&" \
               "v=beta&t=esCQZeqoQCrBkqVo44RH7HkjOLPSM9rrsyJ2ZUwOFn4"
    
        write_file(file_name='people1.jpg', data_link=link)
        # read_data(file_name='people1.jpg')
    

     

    展开全文
  • 在计算机上,文档管理通常是通过操作系统进行文件管理的,例如在windows环境中的...显然,理论上是可行的,例如早期Lotus Domino专业文档管理数据库,如今,当MongoDB+GridFS出现后,可以更专业化管理非结构化文档。

    在计算机上,文档管理通常是通过操作系统进行文件管理的,例如在windows环境中的资源管理上,文件是存在树状的文件系统中。

    如果把这些文件放置到数据库中是否更易于管理呢?显然,理论上是可行的,例如早期Lotus Domino专业文档管理数据库,如今,当MongoDB+GridFS出现后,可以更专业化管理非结构化文档。

    方法一:对于小型文件,可以直接使用MongoDB进行存储管理。

    '''
    Created on 2019年9月5日
    
    @author: xiaoyw
    '''
    import pymongo
    import os
    
    class MongoGridFS(object):
        '''
        classdocs
        '''
        UploadCache = "uploadcache"
        dbURL = "mongodb://localhost:27017"
    
        def __init__(self, params):
            '''
            Constructor
            '''
        #存入小型文件《4M    
        def upLoadSmallFile(self,file_coll,file_name,data_link):
            client = pymongo.MongoClient(self.dbURL)
    
            db = client["store"]
            file_dict = {
                "filename":"test",
                "filesize":100,
                "uploadDate":"2019-09-05 06:05:38.792Z"
                }
    
            collection = db[file_coll]
            fsize = os.path.getsize(file_name)
            file_dict["filesize"] = fsize
            with open(file_name, 'rb') as file_r:
                file_data = file_r.read()
                file_dict["file_data"] = file_data
                file_dict["filename"] = file_name
                file_ = collection.insert(file_dict)
                
            return file_
              
    if __name__ == '__main__':
        a = MongoGridFS("")
        ll = a.upLoadSmallFile("SmallFiles", "MongoGridFS.py", "")
        print (ll)
    
    

    在这里插入图片描述
    方法二:MongoDB内置一套文件系统名为GridFS(Grid File System),我们可以使用它来存储大于16M的文件。

    GridFS具有分布式管理文件的能力,可以突破一般文件系统对file的限制,分段存储,不像普通文件系统是整个存储的。这样读取大型文件时就不会占用大量的内存。

    GridFS会将文件存储在两个Document里:

    • Chunks用来存储二进制数据
    • Files用于存储基本文件信息
      在这里插入图片描述

    gridfs介绍

    GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),适合于不常改变但是经常需要连续访问的大文件。GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。

    GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。

    其中,files中存储文件的元信息,默认使用集合为fs.files,键定义如下:

    • _id 主键
    • length 文件所包含的字节数
    • chunkSize 组成文件的每个块的大小,单位为字节,默认值为256KB,可调整
    • uploadDate 文件被上传到GridFS的日期
    • md5 文件内容的MD5校验值,该值由服务器端测试得到
    • 每一个文件存储的各个chunk的files_id相同
    '''
    '''
    Created on 201995日
    
    @author: xiaoyw
    '''
    import pymongo
    from gridfs import GridFS
    from bson.objectid import ObjectId
    
    class MongoGridFS(object):
        '''
        classdocs
        '''
        UploadCache = "uploadcache"
        dbURL = "mongodb://localhost:27017"
    
    
        def __init__(self, params):
            '''
            Constructor
            '''       
        #上传文件
        def upLoadFile(self,file_coll,file_name,data_link):
            client = pymongo.MongoClient(self.dbURL)
    
            db = client["store"]
            
            filter_condition = {"filename": file_name, "url": data_link}
            gridfs_col = GridFS(db, collection=file_coll)
            file_ = "0"
            query = {"filename":""}
            query["filename"] = file_name
                    
            if gridfs_col.exists(query):
                print('已经存在该文件')
            else:
                
                with open(file_name, 'rb') as file_r:
                    file_data = file_r.read()
                    file_ = gridfs_col.put(data=file_data, **filter_condition)  # 上传到gridfs
                    
                    print(file_)
    
            
            return file_   
        # 按文件名获取文档
        def downLoadFile(self,file_coll,file_name,out_name,ver):
            client = pymongo.MongoClient(self.dbURL)
    
            db = client["store"]
            
            gridfs_col = GridFS(db, collection=file_coll)
            
            file_data = gridfs_col.get_version(filename=file_name, version=ver).read()
            
            with open(out_name, 'wb') as file_w:
                file_w.write(file_data)
            
        # 按文件_Id获取文档       
        def downLoadFilebyID(self,file_coll,_id,out_name):
            client = pymongo.MongoClient(self.dbURL)
    
            db = client["store"]
            
            gridfs_col = GridFS(db, collection=file_coll)
            
            O_Id = ObjectId(_id)
            
            gf = gridfs_col.get(file_id=O_Id)
            file_data = gf.read()
            with open(out_name, 'wb') as file_w:
                
                file_w.write(file_data)     
                
                
            return gf.filename    
    
    if __name__ == '__main__':
        a = MongoGridFS("")
        #a.upLoadFile("pdf","MongoGridFS.py","")
        #a.downLoadFile("pdf","MongoGridFS.py","out2.p",2)
        ll = a.downLoadFilebyID("pdf","5d70a5b283a3c5104cd39346","out3.p")
        print (ll)
    
    

    参考:
    《优化文件下载性能,缓存MongoDB GRIDFS文件(实践讨论稿)》 CSDN博客 肖永威 2016年10月

    展开全文
  • mongodb python gridfs.find()条件查询

    千次阅读 2018-11-13 11:16:33
    for grid_out in gridFS.find({"filename":{"$regex":"/c/"}}): 这样可以匹配到所有以c开头的名称 但是通常我们查的是id,如果直接这样查id会没有结果的,因为再mongodb中,id中一种...
  • python进行mongodb-gridfs去重

    千次阅读 2018-01-27 23:03:42
    说明 ...而我采用了mongodb提供的GridFS功能来管理图片,与一般的文档去重有所区别,因此经过尝试和摸索后,得到如下解决方案,效率较低,但能有效解决问题。 代码 #-*-coding:utf-8-*- from py
  • 它还提供了使用Python中的GridFS上传和下载图像的功能。 安装说明 使用npm软件包管理器从客户端文件夹中存在的package.json文件安装软件包。 导航到客户端文件夹。 -> npm install npm start 要启动Python Server...
  • [color=red][b]mongodb GridFS 性能[/b][/color] 性能, 网评还不错. 不过在生产环境中,国外有用于存储视频流的. GridFS的一个优点是可以存储上百万的文件而无需担心扩容性. 通过同步复制,可以解决分布式文件的...
  • 使用MognoDB GridFS进行文件管理Web应用服务中,可以通过Web服务直接从MognoDB GridFS数据库中,把文件二进制以数据流方式,直接下载读取到浏览器中,供在线浏览和下载使用。 当前Chrome、Microsoft Edge等浏览器...
  • MongoDB所带的GridFS是极为方便的文件管理系统,MongoDB的Shell语言与Python的语言风格非常像,写起来非常方便。重点是需要用StringIO将文件装换为二进制保存。主程序是一个同步图片的小范例。 #encoding=utf-8...
  • 参考: Python3 File(文件) 方法 ...基于Python使用MongoDB及其GridFS进行文档管理 分布式文件存储环境: Python3.8,PyMongo 3.10.1,MongoDB 4.2.3 大文件GridFS上传方法: #!/usr/bin/python3...
  • python使用mongoDB

    2018-11-11 15:44:39
    python使用mongoDB
  • [color=red]mongodb GridFS 性能 [/color] 性能, 网评还不错. 不过在生产环境中,国外有用于存储视频流的. GridFS的一个优点是可以存储上百万的文件而无需担心扩容性. 通过同步复制,可以解决分布式文件的备份...
  • 文件系统GridFS或者Python中对MongoDB的数据文档的增删改查 启动GridFS 在cmd中输入mongofiles -help,可以启动GridFS 使用GridFS命令行上传一个文件 通过put上传一个文件,命令格式为:mongofiles -d 数据库 ...
  • 关于mongodb中的GridFS使用

    千次阅读 2019-06-29 11:11:59
    关于mongodb中的GridFS的基本使用 基本的说明 mongo 作为一个非关系型数据库,使用非常方便,在项目中也经常的使用。 这里主要是说一些他的 网格文件系统 的使用。 在我们想要存储一些文件的时候,可以存放得到文件...
  • 引入模块,其中gridfs模块不需要单独安装,引入了pymongo即可直接引入 from pymongo import MongoClient from gridfs import * import os #链接mongodb client=MongoClient('localhost',27017) #取得对应的...
  • 本机环境:ubuntu14.04,python2.7,mongodb3.0 图片数据在服务器上,但是服务器的mongodb版本比较低,未设置密码,最新版的mongodb不能直接连接,因此在本机上将mongodb降到了3.0版本(此时最新版为3.4)。mongodb...
  • 只需在命令行输入python -m pip install pymongo
  • 文章目录1 Gridfs和bson存储大文件1.1 Gridfs1.2 bson上传(<16m) 1 Gridfs和bson存储大文件 GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),适合于不常改变但是经常需要连续...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,734
精华内容 693
关键字:

python使用gridfs

python 订阅