使用 mongodb的GridFS存储大量视频文件能行么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 mongodb的GridFS存储大量视频文件能行么?相关的知识,希望对你有一定的参考价值。

看晚上说国外有人使用GridFS存储文件了。不知道在平台级别的产品中使用GridFS来存储文件,自动做到多台服务武器的同步,热备等。是否靠谱

参考技术A 大文件的海量存储, 还是直接使用分布式文件系统来的靠谱. 可以使用mongodb来记录文件的meta信息.

个人愚见, 请更多高手来解疑

mongodb Gridfs操作

GridFS 介绍

GridFS是MongoDB规范用于存储和检索大文件,如图片,音频文件,视频文件等。这是一种文件系统用来存储文件,但数据存储于MongoDB集合中。GridFS存储文件比其文档大小16MB限制的更大能力。

GridFS的划分一个文件分成块存储数据每个块在一个单独的文件,每个最大尺寸255K。

GridFS默认使用两个集合 fs.files 和 fs.chunks 存储该文件的元数据和块。每组块标识其唯一的_id ObjectID字段。fs.files切断作为父文件。 fs.chunks 文档 files_id 字段链接块到其父文件。

以下是fs.files集合的样本文件:

{
   "filename": "test.txt",
   "chunkSize": NumberInt(261120),
   "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
   "md5": "7b762939321e146569b07f72c62cca4f",
   "length": NumberInt(646)
}

文件指定的文件名,块大小,上传日期,和长度。

以下是 fs.chunks 文件的样本文件:

{
   "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
   "n": NumberInt(0),
   "data": "Mongo Binary Data"
}

将文件添加到GridFS:

现在,我们将使用GridFS的put命令存储MP3文件。 为此,我们将使用存在于MongoDB的安装文件夹下的bin文件夹的mongofiles.exe工具。

打开命令提示符,导航到MongoDB的安装文件夹下的bin文件夹中的mongofiles.exe,并键入下面的代码:

>mongofiles.exe -d gridfs put song.mp3

这里,gridfs上在文件存储在数据库的数据库名称。 如果数据库不存在,MongoDB会自动动态创建一个新文档。 Song.mp3的是上载的文件的名称。要查看数据库文件的文件,你可以使用查询找到:

>db.fs.files.find()

上面的命令返回以下文档:

{
   _id: ObjectId(‘534a811bf8b4aa4d33fdf94d‘), 
   filename: "song.mp3", 
   chunkSize: 261120, 
   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
   length: 10401959 
}

我们也可以看到在fs.chunks集合涉及使用下面的代码保存的文件都存在于块中,使用以前的查询返回文档ID:

>db.fs.chunks.find({files_id:ObjectId(‘534a811bf8b4aa4d33fdf94d‘)})

在我的示例中,该查询返回40个文档,是整个MP3文件划分成的40块数据。

 

 

前言

GridFS是一种将大型文件存储在MongoDB的文件规范:

 

数据库支持以BSON格式保存二进制对象。 但是MongoDB中BSON对象最大不能超过4MB。

GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档。

为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个块对象可被组合保存在一个块集合中。

 

上传文件

  • Shell

        mongofiles put xxx.txt

        常用参数如下:

 

        -d 指定数据库 

        -u –p 指定用户名,密码

        -h 指定主机

        -port 指定主机端口

        -r 如果存在同名文件则在put成功后删除其他同名文件

 

        通过这样的命令就可以把文件上传到fs集合中。

  • Java

        //获取db

        MongoClient mClient = new MongoClient("10.211.55.8");

        db = mClient.getDB("test");

        //得到Gridfs对象

        GridFS fs = new GridFS(db);

        //访问要上传的文件

        File file = new File("/Users/luoaz/05testDir/files/test1.txt");

        //执行保持

        GridFSInputFile gfFile = fs.createFile(file);

        gfFile.save();

下载文件

  • Shell

        mongofiles get xxx.txt

        常用参数如下:

 

        -d 指定数据库 

        -u –p 指定用户名,密码

        -h 指定主机

        -port 指定主机端口

        -l 下载到本地的文件名,默认和数据库中的名字一致

 

        通过这样的命令就可以把文件从fs集合中下载到本地。

  • Java

        Java 下载的重点是怎么获取到文件流,获取到文件流后就跟普通的保持文件到本地一样了。

          //获取db

        MongoClient mClient = new MongoClient("10.211.55.8");

        db = mClient.getDB("test");

        //得到Gridfs对象

        GridFS fs = new GridFS(db);

        

        //要下载到的文件路径

        File file = new File("/Users/files/down_test1.txt");

        FileOutputStream os = new FileOutputStream(file);

                        

        //获得文件流

        InputStream is = fs.findOne(new BasicDBObject("filename","test1.txt")).getInputStream();

                        

        //下载

        byte[] bytes = new byte[1024];

        while(is.read(bytes)>0){

                os.write(bytes);

        }

        os.flush();

        os.close();

 

删除文件

  • Shell

        mongofiles delete xxx.txt

        删除指定名称的文件,如果存在同名文件则都删除

        常用参数如下:

 

        -d 指定数据库 

        -u –p 指定用户名,密码

        -h 指定主机

        -port 指定主机端口

  • Java

        //获取db

        MongoClient mClient = new MongoClient("10.211.55.8");

        db = mClient.getDB("test");

        //得到Gridfs对象

        GridFS fs = new GridFS(db);

                        

        //删除指定文件名称的文件

        fs.remove("test1.txt");

查看文件

  • Shell

        1、list 

                显示所有文件

                mongofiles list xx.txt

                显示所有的指定文件名的文件

        2、search

                搜索指定名称的文件,可以模糊搜索

                mongofiles list xx.txt

                mongofiles list .txt

  • Java

        这个就跟MongoDB的find用法一样了

 

 

 

/*//保存文件
GridFSFile file = myFS.createFile(new File("D:/aa.png"));
file.save(); */

//输出文件
GridFSDBFile file1 =myFS.findOne("aa.png");
file1.writeTo(new File("D:/image1.png"));

//删除文件
/*GridFSDBFile file =myFS.findOne("image1.jpg");
myFS.remove((ObjectId) file2.getId());*/












以上是关于使用 mongodb的GridFS存储大量视频文件能行么?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb学习之:GridFS

MongoDB GridFS

MongoDB_GridFS_存储文件

转发mongodb Gridfs操作

MongoDB GridFS

MongoDBMongodb——GridFS存储