GridFS是MongoDB规范用于存储和检索大文件,如图片,音频文件,视频文件等。这是一种文件系统用来存储文件,但数据存储于MongoDB集合中。GridFS存储文件比其文档大小16MB限制的更大能力。html
GridFS的划分一个文件分红块存储数据每一个块在一个单独的文件,每一个最大尺寸255K。mongodb
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) }
文件指定的文件名,块大小,上传日期,和长度。spa
如下是 fs.chunks 文件的样本文件:视频
{ "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data" }
如今,咱们将使用GridFS的put命令存储MP3文件。 为此,咱们将使用存在于MongoDB的安装文件夹下的bin文件夹的mongofiles.exe工具。htm
打开命令提示符,导航到MongoDB的安装文件夹下的bin文件夹中的mongofiles.exe,并键入下面的代码:对象
>mongofiles.exe -d gridfs put song.mp3
这里,gridfs上在文件存储在数据库的数据库名称。 若是数据库不存在,MongoDB会自动动态建立一个新文档。 Song.mp3的是上载的文件的名称。要查看数据库文件的文件,你可使用查询找到:blog
>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 规范提供了一种透明的机制,能够将一个大文件分割成为多个较小的文档。
为实现这点,该规范指定了一个将文件分块的标准。每一个文件都将在文件集合对象中保存一个元数据对象,一个或多个块对象可被组合保存在一个块集合中。
上传文件
mongofiles put xxx.txt
经常使用参数以下:
-d 指定数据库
-u –p 指定用户名,密码
-h 指定主机
-port 指定主机端口
-r 若是存在同名文件则在put成功后删除其余同名文件
经过这样的命令就能够把文件上传到fs集合中。
//获取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();
下载文件
mongofiles get xxx.txt
经常使用参数以下:
-d 指定数据库
-u –p 指定用户名,密码
-h 指定主机
-port 指定主机端口
-l 下载到本地的文件名,默认和数据库中的名字一致
经过这样的命令就能够把文件从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/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();
删除文件
mongofiles delete xxx.txt
删除指定名称的文件,若是存在同名文件则都删除
经常使用参数以下:
-d 指定数据库
-u –p 指定用户名,密码
-h 指定主机
-port 指定主机端口
//获取db
MongoClient mClient = new MongoClient("10.211.55.8");
db = mClient.getDB("test");
//获得Gridfs对象
GridFS fs = new GridFS(db);
//删除指定文件名称的文件
fs.remove("test1.txt");
查看文件
一、list
显示全部文件
mongofiles list xx.txt
显示全部的指定文件名的文件
二、search
搜索指定名称的文件,能够模糊搜索
mongofiles list xx.txt
mongofiles list .txt
这个就跟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
标签: mongodb