精华内容
下载资源
问答
  • GridFS

    2020-10-12 11:48:07
    GridFS教程 一、GridFS简介 1.GridFS的作用 GridFS是用于存储和检索超过16M文档大小限制的文件的规范。GridFS不会将文件存储在单个文档中,而是将文件分成多个部分或大块。并将每个大块存储为单独的文档。 默认情况...

    GridFS教程

    一、GridFS简介

    1.GridFS的作用

    GridFS是用于存储和检索超过16M文档大小限制的文件的规范。GridFS不会将文件存储在单个文档中,而是将文件分成多个部分或大块。并将每个大块存储为单独的文档。

    默认情况下,GridFS使用的默认块大小为255kb,也就是说除了最后一个块,GridFS会将文件分成255kb的块,而最后一块只有必要的大小。如果一个文件,不大于块大小仅具有最终块,仅使用所需的空间以及一些其他元数据。

    2.GridFS是如何存储文件的

    • GridFS使用两个集合来存储文件,一个集合存储文件块,另一个集合存储文件元数据。

    • 当查询文件时,驱动程序将根据需要重新组装文件块。

    • 可以对GridFS存储的文件进行范围查询。也可以从文件的任意部分访问信息,比如跳到视频或音频文件的中间。

    3.什么时候使用GridFS

    • 如果文件系统限制了目录中文件的数量,则可以使用GridFS来存储所需数量的文件。
    • 当您要访问大文件部分的信息而不必将整个文件加载到内存中时,可以使用GridFS来调用文件的某些部分,而无需将整个文件读入内存。
    • 当您想要使文件和元数据自动同步并跨多个系统和设施部署时,可以使用GridFS。使用地理上分散的副本集时,MongoDB可以自动将文件及其元数据分发到许多 mongod实例和设施。

    如果文件均小于16 MB的限制,请考虑将每个文件存储在单个文档中,而不要使用GridFS。

    4.GridFS的集合

    4.1 存储二进制块的chunks

    集合名: fs.chunks

    集合中的每个文档代表一个单独的文件块,如下:
    { 
      “ _id”  : < ObjectId > ,# 块的唯一ObjectId
      “ files_id”  : < ObjectId > ,#在_id“父”的文件,如在指定的files 集合。
      “ n”  : < num > , #块的序列号。GridFS从0开始对所有块进行编号。
      “ data”  : < 二进制>  #块的有效载荷作为BSON Binary类型。
    }
    

    4.2 存储元数据的files

    集合名:fs.files

    files集合中的每个文档代表GridFS中的一个文件 。如下:
    { 
      “ _id”  : < ObjectId > , #该文档的唯一标识符。该_id是你选择的原始文档中的数据类型。
      “ length”  : < num > ,#文档的大小(以字节为单位)。
      “ chunkSize”  : < num > ,#每个块的大小(以字节为单位)。
      “ uploadDate”  : < 时间戳> ,#GridFS首次存储文档的日期。此值具有 Date类型。
      “ md5”  : < 哈希> ,
      “ filename”  : < 字符串> ,#可选的。GridFS文件的可读名称。
      “ contentType“  : < 字符串> ,
      ” aliases“  : < 字符串 数组>,
      “metadata”  : <任何> ,#元数据字段,可以是任何数据类型,并且可以包含您要存储的任何其他信息。如果希望向files 集合中的文档添加其他任意字段,请将其添加到元数据字段中的对象。
    }
    

    如果您需要分片GridFS数据存储,请使用chunks收集设置或作为分片键索引。

    任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,即文件的实际内容;而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode…)等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。
    文件的元数据有以下几项内容:

    File   文件名
    Size   文件大小(字节)
    Blocks   文件使用的数据块总数
    IO Block   数据块的大小
    regular file:文件类型(常规文件) 
    Device 设备编号 
    Inode 文件所在的Inode
    Links 硬链接次数
    Access 权限
    Uid 属主id/用户
    Gid 属组id/组名
    Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间 
    Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。 
    Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。
    
    在linux系统下,使用stat(显示inode信息)命令可以查看一个文件的上述信息。
    

    二、GridFS的命令行操作工具mongofiles

    1.语法格式

    mongofiles <选项> <命令> <文件名>
    
    1) 选项。您可以使用这些选项中的一个或多个来控制的行为mongofiles。
    2) 命令。使用以下命令之一确定的操作mongofiles。
    3) 文件名可以是:本地文件系统上的文件名或GridFS对象。
    

    2.应用案例

    2.1 上传文件到GridFS

    ./mongofiles --port 27017 -d dbimg put /root/car01.jpg 
    

    2.2 下载文件

    根据文件名下载

    ./mongofiles --port 27017  -d dbimg get /root/car01.jpg --local /root/img/1.jpg
    

    根据文件的objectid下载

    ./mongofiles --port 27017 get_id 'ObjectId("5e149750685a5f06e84877c4")' --local /root/img/2.jpg -d dbimg
    

    2.3 查看文件

    查看所有文件信息

    ./mongofiles --port 27017 -d dbimg list 
    
    

    查看指定文件的信息

    ./mongofiles --port 27017 -d dbimg list filename
    

    2.4 搜索文件

    根据文件名搜索指定文件

    ./mongofiles --port 27017 -d dbimg search /root/car01.jpg
    

    2.5 删除文件

    根据文件名删除

    ./mongofiles --port 27017 -d dbimg delete /root/car01.jpg 
    

    根据objectid删除

    ./mongofiles --port 27017 delete_id 'ObjectId("5b35153aaa1fc308053d8188")' /root/car01.jpg -d dbimg
    

    三、Springbootdata操作GridFS

    @SpringBootTest(classes = App.class)
    @RunWith(SpringJUnit4ClassRunner.class)
    public class TestMongofiles {
    
        @Autowired
        private MongoTemplate mongoTemplate;
        @Autowired
        private GridFsTemplate gridFsTemplate;
    
        // 上传文件
        @Test
        public void test0() throws FileNotFoundException {
            File file = new File("D:\\develop\\上课资料\\web_上\\html\\html资料\\img\\car05.jpg");
            FileInputStream fileInputStream = new FileInputStream(file);
            ObjectId objectId = gridFsTemplate.store(fileInputStream, "car.jpg", "img/jpeg");
            System.out.println(objectId.toString());
        }
    
        @Test
        public void test5() {
            Query query = new Query(Criteria.where("_id").is("5e149e946cff115a50224232"));
            // 查询一个文件
            GridFSFile gridFSFile = gridFsTemplate.findOne(query);
            ObjectId objectId = gridFSFile.getObjectId();
            System.out.println(objectId);
        }
    
        @Test
        public void test6() {
            Query query = new Query();
            // 查询所有文件
            GridFSFindIterable gridFSFiles = gridFsTemplate.find(query);
            for (GridFSFile gridFSFile : gridFSFiles) {
                System.out.println(gridFSFile.getObjectId());
            }
        }
        //下载文件
    
        @Test
        public void test1() throws IOException {
            //根据id查询文件
            GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is("5e14a3ec6cff115ee0d23206")));
            //打开下载流对象
            GridFSBucket gridFSBucket = GridFSBuckets.create(mongoTemplate.getDb());
            GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
            //创建GridFSResource,用于获取流对象
            GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
            // 获取流中的数据
            InputStream inputStream = gridFsResource.getInputStream();
            File f1 = new File("D:\\test\\get.png");
            if (!f1.exists()) {
                f1.getParentFile().mkdirs();//递归创建父目录
            }
            FileOutputStream fileOutputStream = new FileOutputStream(f1);
            byte[] bytes = new byte[1025];
            int len = 0;
            while ((len = inputStream.read(bytes))!=-1) {
                fileOutputStream.write(bytes,0,len);
            }
            inputStream.close();
            fileOutputStream.close();
    
    
        }
    
    
        //删除文件
        @Test
        public void testDelFile() throws IOException {
            //根据文件id删除fs.files和fs.chunks中的记录
            gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5e149e946cff115a50224232")));
        }
    }
    
    

    将mongoDb中的图片展示到前台页面

    @RestController
    @RequestMapping("/imgFile")
    public class ImgFileController {
        @Autowired
        private MongoTemplate mongoTemplate;
    
        @Autowired
        private GridFsTemplate gridFsTemplate;
    
        @RequestMapping("/show")
        public PictureBean show() throws IOException {
            Query query = new Query();
            query.addCriteria(Criteria.where("_id").is("5e14a3b66cff110864095cc7"));
            // 查询所有文件
            GridFSFile gridFSFile = gridFsTemplate.findOne(query);
            // 打开下载流对象
            GridFSBucket gridFSBucket = GridFSBuckets.create(mongoTemplate.getDb());
            GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
            //构建GridFSResources,用于获取文件的输入流对象
            GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
            InputStream in = gridFsResource.getInputStream();
            System.out.println(gridFSFile.getObjectId());
            byte[] data = new byte[1024];
            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
            int len = -1;
            try {
                while ((len = in.read(data)) != -1) {
                    swapStream.write(data, 0, len);
                }
                in.close();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
    
            BASE64Encoder encoder = new BASE64Encoder();
            String pictureBase = encoder.encode(swapStream.toByteArray()).trim();
            System.out.println(pictureBase);
            return new PictureBean(pictureBase);
        }
    }
    
    

    HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/jquery-3.3.1.min.js"></script>
        <script>
            $(function () {
                $.ajax({
                    url:"/imgFile/show",
                    type:"post",
                    success:function (result) {
                        console.log(result);
                        $('#img').attr("src","data:image/png;base64,"+result.imgEncode);
                    }
                })
            })
        </script>
    </head>
    <body>
    <img id="img" src="" alt="">
    </body>
    </html>
    
    展开全文
  • gridfs

    千次阅读 2013-01-29 19:57:10
    GridFS将文件分块存储,分别将文件的元信息和文件块存入不同的collection,mongoDB提供的GridFS类将文件默认分块大小设置为256K。如果不改变设置,GridFS在存入文件时,将文件块存入db.fs.chunks的collection中,将...

    from : http://blog.csdn.net/k1988/article/details/5916825


    概念与说明

    MongoDB介绍

    MongoDB的名称取自“humongous”(巨大的) 的中间部分 。于2010年8月5日发布了最新的正式版本v1.6,这是其继1.0、1.2、1.4版本后的第四个主要稳定版本。由10gen公司为其提供商业支持。• 它是一个开源的、面向文档的数据库,属于nosql数据库中的一种。(nosql全称是”notonly sql”,是非关系型数据存储的广义定义)。

    它可运行在Linux、Windows或OSX平台,支持32位和64位应用并且提供了Java,PHP,Ruby,C#,C++,JavaScript等多种语言的驱动程序。

    MongoDB特性

    MongoDB是一个可扩展、高性能的下一代数据库,由C++语言编写,旨在为web应用提供可扩展的高性能数据存储解决方案。它的特点是高性能、易部署、易使用,存储数据非常方便,主要特性有:

    l        模式自由,支持动态查询、完全索引,可轻易查询文档中内嵌的对象及数组。

    l        面向集合存储,易存储对象类型的数据, 包括文档内嵌对象及数组 。

    l        高效的数据存储,支持二进制数据及大型对象(如照片和视频) 。

    l        支持复制和故障恢复;提供了主-从、主-主模式的数据复制及服务器之间的数据复制。

    l        自动分片以支持云级别的伸缩性,支持水平的数据库集群,可动态添加额外的服务器 。

     

    MongoDB结构

    传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB同样也是由数据库(database) 、集合(collection)、文档对象(document)三个层次组成。 MongoDB里的集合对应于关系型数据库里的表,但是集合中没有列、行和关系的概念,这体现了模式自由的特点。

    MongoDB存储的数据格式是key-value对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。这种数据格式称作 BSON,即 “Binary Serialized Document Notation”,是一种类似JSON的二进制序列化文档。

    MongoDB使用了内存映射文件进行数据管理,把所有空闲内存当缓存使用,且不能指定内存大小。这既是优点也是缺点:优点--可以最大限度提升性能;缺点--容易受其它程序干扰。

    数据空间采用预分配,目的是为了避免形成过多的硬盘碎片。它为每个数据库分配一系列文件,每个数据文件都会被预分配一个大小,第一个文件名字为“.0 ” ,大小为64MB,第二个文件“.1”为128MB ,依此类推,在32位模式运行时支持的最大文件为2GB。随着数据量的增加,可以在其数据目录里看到这些不断递增的文件。

    MongoDB没有自动递增或序列特性,当BSON对象插入到数据库中时,如果没有提供“_id”字段 ,数据库会自动生成一个ObjectId对象作为“_id”的值插入到集合中作为该文档的主键

    (这就避免了其它数据库意外地选择相同的惟一标识符的情况) ,“_id”的值由4字节的时间戳,3字节的机器号,2字节的进程id以及3字节的自增计数组成。当然字段“_id”的值可以手动生成(任意类型都可),只要能够保证惟一性。

    每个插入的BSON对象大小不能超过4MB,如果超过4M时需使用 GridFS来储存数据。删除记录后不会释放已分配的空间,换句话说:原记录空间不删除。

    MongoDB二进制文件功能

    MongoDB的服务器端程序只有两个:

    Mongod.exe: MongoDB的主要的数据存储服务程序和配置服务程序。

    Mongos.exe:MongoDB的集群路由程序,负责自动分片,用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器,可以将数据库分表存储在集群的各个节点上。

    MongoDB的客户端工具有很多,最常用的就是Mongo.exe,它做为对MongoDB的管控程序,可以使用输入命令的方式修改、查询MongoDB的数据和配置。

    MongoDB常用命令

    l        Help:查看mongodb支持的命令。

    l        db.help:查看当前数据库支持哪些方法当前数据库下的表。

    l        db.dbname.help():查看当前表collection支持哪些方法。

    l        show dbs:列出所有数据库。

    l        use test: 使用数据库test ,即使这个数据库不存在也可以执行,但该数据库不会立刻被新建,要等到执行了insert之类的操作时,才会建立这个数据库。

    l        show collections : 列出当前数据库的所有文档。

    l        db : 显示当前数据库。

    l        show users : 列出用户。

    l        db.printShardingStatus() :将当前MongoDB分片的状态打印出来。

    l        db.runCommand({ xxxx}) :在当前DB上执行一些命令。

    l        db.xxx.stats() :显示当前db的某个collection的状态。

    l        db.xxx.find():显示当前db的某个collection的所有内容。

     

    详细的MongoDB的shell命令见:http://www.mongodb.org/display/DOCS/dbshell+Reference

     

    GridFS

    MongoDB自带的分布式文件系统GridFS ,可以支持海量的数据存储。

    GridFS将文件分块存储,分别将文件的元信息和文件块存入不同的collection,mongoDB提供的GridFS类将文件默认分块大小设置为256K。如果不改变设置,GridFS在存入文件时,将文件块存入db.fs.chunks的collection中,将文件信息存入db.fs.files中。

    文件必须的信息有以下字段:

     {
      "_id" : <unspecified>,                  // unique ID for this file
      "length" : data_number,                 // size of the file in bytes
      "chunkSize" : data_number,              // size of each of the chunks.  Default is 256k
      "uploadDate" : data_date,               // date when object first stored
      "md5" : data_string                     // result of running the "filemd5" command on this file's chunks
    }

     文件块的信息字段包括:

    {    
      "filename" : data_string,               // human name for the file
      "contentType" : data_string,            // valid mime type for the object
      "aliases" : data_array of data_string, // optional array of alias strings
      "metadata" : data_object,               // anything the user wants to store }

     
    

    “_id”的类型可以自选,但是默认类型是BSON对象的objectid。

    块信息的“files_id”是外键与files集合中的“_id”相关联。

     

    详情可参考:http://www.mongodb.org/display/DOCS/GridFS+Specification

     

    Sharding

    一个mongodb集群包括一些shards(每个shard包括一至多个mongod进程),mongos路由进程,一个或多个config服务器 。

    名词:

    Shards : 每一个shards包括一个或多个存储数据的mongod进程,典型的每个shards开启多个服务来提高服务的可用性。这些mongod进程在shards中组成一个复制集(replica pairs)。

    Chunks: Chunks是一个集合中的一个数据范围,(collection,minKey,maxKey)描叙一个chunks,它介于minKey和maxKey范围之间。例如假设chunks 的maxsize大小是100M,如果一个文件达到或超过这个范围时,会被切分到2个新的chunks中。当一个shard的数据过量时,会将一整个chunks迁移到其他的shards上。同样,chunks也可以迁移到其他的shards上。

    Config Servers : Config服务器存储着集群的metadata信息,包括每个服务器,每个shard的基本信息和chunk信息Config服务器主要存储的是chunk信息。每一个config服务器都复制了完整的chunk信息。

     

    一个分布式集群至少需要三部分:

    1、两个或更多的Shards。

    2、最少一台Config Server。

    3、一个mongos路由进程。

     

    Sharding的介绍:http://www.mongodb.org/display/DOCS/Sharding+Introduction

    Sharding配置说明:http://www.mongodb.org/display/DOCS/Configuring+Sharding

    Sharding配置的官方示例:http://www.mongodb.org/display/DOCS/A+Sample+Configuration+Session

     

    MongoDB编译和构建

    1、  下载MongoDB源码并解压。

    2、  下载boost并且解压到MongoDB所在盘根目录,目录名为boost,然后编译之。如果已经拥有了Boost可以使用mklink在根目录下面创建目录链接。

    3、  下载SpiderMonkey做为js引擎库(http://github.com/dwight/vc2010_js/tree/master/src/),并解压到和mongodb文件夹同级的“js”文件夹内。

    4、  打开db/db_10.sln,选择相应的平台并且编译,有可能要修改一些语法错误。

    5、  安装python和SCons(一种构建工具)。http://www.python.org/download/releases/2.6.4/ http://sourceforge.net/projects/scons/files/scons/1.2.0/scons-1.2.0.win32.exe/download.

    6、  在MongoDB文件夹中运行命令行,并且有可能需要运行VS2010设置环境变量的批处理文件vcvars*.bat。

    To build:

    scons                   // build mongod

    scons mongoclient.lib   // build C++ client driver library

    scons all               // build all end user components

    scons .                 // build all including unit test

    服务架设

    在Mongod、Mongos等程序的同级目录下创建三个文件夹data_shard1、data_shard2 、data_config作为数据库目录。

    1、shard1启动

    start mongod --dbpath %cd%/data_shard1 --port 27020

    2、shard2启动

    start mongod --dbpath %cd%/data_shard2 --port 27021

    3、配置服务器启动

    start mongod --dbpath %cd%/data_config --port 27022 --configsvr

    4、路由服务器启动(使用的默认的端口27017)

    start mongos --configdb 127.0.0.1:27022

    5、启动mongo,也使用默认端口,连接的是mongos.此时config服务器中有默认的admin数据库。

    使用use admin切换成admin数据库

    > config = connect("127.0.0.1:27022")

    > config = config.getSisterDB("config")

    使用db.runCommand({addshard: "127.0.0.1:27020", allowLocal:1, maxSize:100}) 添加shard1

    使用db.runCommand({addshard: "127.0.0.1:27021", allowLocal:1, maxSize:100}) 添加shard2

    6、创建一个可以被sharding的数据库test。

    >test=db.getSisterDB("test")

    >db.runCommand({enablesharding:"test"})

    一旦设置了某数据库可以被sharding,那么此数据库中的不同数据集就会放在不同的分片上。

    7、数据集分块:db.runCommand( { shardcollection : "test.fs.chunks", key:{files_id:1}}) ,此数据集的主shards被设置为了shard1。

    8、查看分块状态:db.printShardingStatus()

     

    经过以上步骤,就架设成功了一个MongoDB集群,每个Shards的容量由“maxSize:100”限定为了100M大小,并且test.fs.chunks这个collection里的内容会被自动分片存放。

    实例分析

    在上面的程序架设好了之后,使用MongoDB工具集中的Mongofiles.exe程序连续地put一个20M的文件。

    使用db.fs.chunks.stats()命令查看chunks的分块状态得知mongos优先将文件块放在了shard1上,当shard1的大小超过一定规模后(这个规模又不是maxSize设定的100M)才会将文件块迁移向Shard2。

    当chunks这个collection在Shard2上面占用的空间大于100M之后(实际上是108906496字节),mongos不断提示“[Balancer] no availalable shards to take chunks”,然后我又新建了shard3同样设置为“maxsize:100”并且添加到集群中,这时mongos自动将一些块迁移到shard3中。等到停止迁移后我新增块,新增的块还是先写入shard1并且不断地有chunks迁移到shard3,但是最终shard1的数据大小远大于100M。

    另外,db.fs.chunks在shard2的分布情况如下:

         "shard0001" : {

                           "ns" : "test.fs.chunks",

                           "count" : 340,

                           "size" : 88506100,

                           "avgObjSize" : 260312.0588235294,

                           "storageSize" : 108906496,

                           "numExtents" : 11,

                           "nindexes" : 3,

                           "lastExtentSize" : 21645312,

                           "paddingFactor" : 1,

                           "flags" : 1,

                           "totalIndexSize" : 90112,

                           "indexSizes" : {

                                   "_id_" : 32768,

                                   "files_id_1" : 24576,

                                   "files_id_1_n_1" : 32768

                           },

                           "ok" : 1

                   }

    由状态信息可知,实际储存的文件大小是88.5M,但是占用的储存空间确是108.9M,可能chunks多余的未用部分用来做了对齐操作。

     

    MongoDB的C++ API使用

    想要自己编写MongoDB的客户端应用,可以先编译出MongDB的客户端静态库“mongoclient.lib”并且包含在自己的工程中。接着可以使用MongoDB源码中的一些头文件,“client/dbclient.h”,“client/gridfs.h”等。

    对于文件分布式存储来说,使用gridfs.h中的GridFSGridFileGridFSChunk等类就可以完成简单的本地文件上传、文件下载、文件块读取、内存数据上传,想完成其它更为复杂的操作把文件块当做普通的BSON对象来操作,需要自己实现代码。

    例:存储本地文件

    DBClientConnection c;

    c.connect("localhost");

    GridFS fs (c, "test");

    BSONObj file = fs.storeFile(filename.c_str(), filename.length(), filename);


    展开全文
  • 也-gridfs 也+ gridfs
  • $ npm install --save mongoose-gridfs 用法 const { createReadStream } = require ( 'fs' ) ; const { createModel } = require ( 'mongoose-gridfs' ) ; // use default bucket const Attachment = createModel ...
  • GridFS使用

    2020-03-15 21:34:45
    GridFS介绍 GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用MongoDB存储数据,使用GridFS可以快速集成开发。 它的工作原理是: 在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行...

    GridFS介绍

    GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用MongoDB存储数据,使用GridFS可以快速集成开发。

    它的工作原理是:
    在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数
    据信息(文件名称、块大小、上传时间等信息)。
    从GridFS中读取文件要对文件的各各块进行组装、合并。
    详细参考:https://docs.mongodb.com/manual/core/gridfs/

    GridFS 存取文件测试

    1、存文件
    使用GridFsTemplate存储文件测试代码:
    向测试程序注入GridFsTemplate。

     @Test
        public void testGridFs() throws FileNotFoundException {
            //要存储的文件
            File file = new File("d:/index_banner.html");
            //定义输入流
            FileInputStream inputStram = new FileInputStream(file);
            //向GridFS存储文件
            ObjectId objectId = = gridFsTemplate.store(inputStram, "轮播图测试文件01", "");
            //得到文件ID
            String fileId = objectId.toString();
            System.out.println(file);
        }
    

    存储原理说明:
    文件存储成功得到一个文件id
    此文件id是fs.files集合中的主键。
    可以通过文件id查询fs.chunks表中的记录,得到文件的内容。

    2、读取文件
    1)在config包中定义Mongodb的配置类,如下:
    GridFSBucket用于打开下载流对象

    @Configuration
    public class MongoConfig {
        @Value("${spring.data.mongodb.database}")
        String db;
        @Bean
        public GridFSBucket getGridFSBucket(MongoClient mongoClient){
            MongoDatabase database = mongoClient.getDatabase(db);
            GridFSBucket bucket = GridFSBuckets.create(database);
            return bucket;
        }
    }
    

    2)测试代码如下

    @SpringBootTest
      @RunWith(SpringRunner.class)
      public class GridFsTest {
        @Autowired
        GridFsTemplate gridFsTemplate;
        @Autowired
        GridFSBucket gridFSBucket;
       
        @Test
        public void queryFile() throws IOException {
            String fileId = "5b9c54e264c614237c271a99";
            //根据id查询文件
            GridFSFile gridFSFile =
    gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
            //打开下载流对象
            GridFSDownloadStream gridFSDownloadStream =
    gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
            //创建gridFsResource,用于获取流对象
            GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
            //获取流中的数据
            String s = IOUtils.toString(gridFsResource.getInputStream(), "UTF‐8");
            System.out.println(s);
        }
     
    

    3、删除文件

    //删除文件
    @Test
    public void testDelFile() throws IOException {
        //根据文件id删除fs.files和fs.chunks中的记录
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5b32480ed3a022164c4d2f92")));
    }
    
    展开全文
  • Linux利用nginx-gridfs搭建部署,nginx-gridfs-0.8 可用
  • GridFS心得

    2019-03-31 19:53:21
    GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用MongoDB存储数据,使用GridFS可以快速集成开发。 ​ 它的工作原理是: ​ 在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储...

    GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用MongoDB存储数据,使用GridFS可以快速集成开发。

    ​ 它的工作原理是:

    ​ 在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数据信息(文件名称、块大小、上传时间等信息)。

    ​ 从GridFS中读取文件要对文件的各各块进行组装、合并。

    GridFS存取文件:

    1、存文件

    使用GridFsTemplate存储文件测试代码:

    向测试程序注入GridFsTemplate。

     @Test
        public void testGridFs() throws FileNotFoundException {
            //要存储的文件
            File file = new File("d:/index_banner.html");
            //定义输入流
            FileInputStream inputStram = new FileInputStream(file);
            //向GridFS存储文件
            ObjectId objectId = = gridFsTemplate.store(inputStram, "轮播图测试文件01", "");
            //得到文件ID
            String fileId = objectId.toString();
            System.out.println(file);
        }

    存储原理:

    文件存储成功得到一个文件id

    此文件id是fs.files集合中的主键。

    可以通过文件id查询fs.chunks表中的记录,得到文件的内容。

    2、读取文件

    1)在config包中定义Mongodb的配置类,如下:

    GridFSBucket用于打开下载流对象

    @Configuration
    public class MongoConfig {
        @Value("${spring.data.mongodb.database}")
        String db;
        @Bean
        public GridFSBucket getGridFSBucket(MongoClient mongoClient){
            MongoDatabase database = mongoClient.getDatabase(db);
            GridFSBucket bucket = GridFSBuckets.create(database);
            return bucket;
        }
    }
    展开全文
  • var GridFS = require ( 'gridfs' ) ; var fs = require ( 'fs' ) ; var gfs = new GridFS ( mongo , db , 'files' ) ; gfs . open ( '554385768a812acf16c3dd44' , function ( err , file ) { if ( ! err ) { ...
  • GridFS文件系统适配器 GridFS适配器,用于接收。 对于处理来自主体解析器的流式多部分文件上传特别有用。 当前仅支持Node 6及更高版本 ======================================== 安装 $ npm install skipper-...
  • Refile :: Gridfs 一个GridFS的后端进行。 为什么? 您想将所有数据存储在一个地方,以简化备份和复制 考虑到 Gem是使用Mongodb 3.0,Ruby 2.2和Mongo 2.1开发和测试的。 它可能适用于早期版本。 安装 将此行添加...
  • GridFS adapater

    2020-12-09 13:23:53
    <p>Maybe I can help you to create this package, I did somethings with GridFS https://github.com/RocketChat/Rocket.Chat/blob/master/packages/rocketchat-file/file.server.coffee</p><p>该提问来源于开源...
  • Node.js 的 GridFS 包装器模块。 var fs = require ( 'fs' ) ; var mongo = require ( 'mongodb' ) ; var Grid = require ( 'gridfs' ) ; mongo . MongoClient . connect ( yourMongoURI , function ( err , db ) {...
  • MongoDB GridFS

    2018-05-15 10:17:45
    GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。  GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。  GridFS 可以更好的存储大于16M的文件。  GridFS 会将...
  • 骆驼:: Mongodb GridFS 该项目是Mongodb GridFS的Camel组件。 要构建此项目,请使用 mvn install 网址格式 gridfs:connectionBean?database=databaseName&bucket=bucket&operation=operationName[&moreOptions.....
  • GridFS简介

    2020-04-07 09:32:39
    GridFS是MongoDB中存储和查询超过BSON文件大小限制(16M)的规范,不像BSON文件那样在一个单独的文档中存储文件,GridFS将文件分成多个块,每个块作为一个单独的文档。默认情况下,每个GridFS块是255kB,意味着除了...
  • gridfs2s3 - 将 MongoDB GridFS 文件迁移到 AWS S3 的工具 这是一个简单的工具,它将抓取您指向的 GridFS 中的所有文件,并将它们粘贴到 S3 中 安装 go install github.com/Bowbaq/gridfs2s3 用法 gridfs2s3 -h flag...
  • gridfs intro

    2019-10-06 01:47:16
    gridfs intro http://blog.nosqlfan.com/html/406.htmlmongodb GridFS 介绍 作者:nosqlfa...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,806
精华内容 3,122
关键字:

gridfs