mongodb自带的分布式文件系统-分布式文件系统
mongodb除了能够存储大量的数据外,还内置了一个非常好用的文件系统。
基于mongodb集群的优势,GridFS当然也是分布式的,而且备份也方便。
当用户把文件上传到GridFS后,文件会被分割成大小为256KB的块,并单独存放。
好处如下:
1.可以有Replication;
2.可以利用MongoDB的权限访问控制;
3.可以利用现成的MongoDB备份方式;
今天主要是学习如何使用data这个框架来操作GridFS,首先配置gridFs的模板类
<!-- Mongodb gridFs的模板 -->
<bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
<constructor-arg ref="mongoDbFactory" />
<constructor-arg ref="mappingConverter" />
</bean>
/**
* 上传文件
* @author yinjihuan
* @throws Exception
*/
public static void uploadFile() throws Exception {
File file = new File("/Users/yinjihuan/Downlaods/logo.webp");
InputStream content = new FileInputStream(file);
//存储文件的额外信息,比如用户ID,后面要查询某个用户的所有文件时就可以直接查询
DBObject metadata = new BasicDBObject("userId", "1001");
GridFSFile gridFSFile = gridFsTemplate.store(content, file.getName(), "image/png", metadata);
String fileId = gridFSFile.getId().toString();
System.out.println(fileId);
}
文件默认是上传到数据中的fs.files和fs.chunks中
files是用来存储文件的信息,文件名,md5,文件大小,还有刚刚的metadata,上传时间等等数据,数据格式如下:
{
"_id": ObjectId("57c17bb0d4c666b6e53ba795"),
"metadata": {
"user_id": 1001
},
"filename": "file",
"aliases": null,
"chunkSize": NumberLong(261120),
"uploadDate": ISODate("2016-09-08T11:38:24.999Z"),
"length": NumberLong(165253),
"contentType": "image/png",
"md5": "668727a643ddd6df2e98f164d9fc90fd"
}
chunks则是用来存储文件内容的
1.files_id就是文件的ID,也就是files集合中的_id
2.n是文件块的索引,通常文件会被分割成256KB的块大小存储
3.data就是文件的数据了
当需要访问文件的时候通过文件ID可以找到文件被分成了多少块,然后从第一块按顺序开始读取,返回给用户。
{
"_id": ObjectId("57c18993d4c6355ffeb6f8ae"),
"files_id": ObjectId("57c17bb0d4c666b6e53ba795"),
"n": 0,
"data": BinData(0, "iVBORw0KGgDSDDSDDSD5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+Yj5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+YjoA")
}
{
"_id": ObjectId("57c18993d4c6355ffeb6f8ae"),
"files_id": ObjectId("57c17bb0d4c666b6e53ba795"),
"n": 1,
"data": BinData(1,"iVBORw0KGgDSDDSDDSD5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+Yj5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+YjoA")
}
/**
* 根据文件ID查询文件
* @author yinjihuan
* @param fileId
* @return
* @throws Exception
*/
public static GridFSDBFile getFile(String fileId) throws Exception {
return gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
}
/**
* 根据文件ID删除文件
* @author yinjihuan
* @param fileId
* @throws Exception
*/
public static void removeFile(String fileId) throws Exception {
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId)));
}
如果在Spring mvc中想直接访问存储的文件也很简单,直接通过文件ID查询该文件,然后直接输出到response就是了,记得要设置ContentType,这时就明白为什么存储的时候要把ContentType存起来了。
/**
* 访问图片
* @author yinjihuan
* @param fileId
* @param request
* @param response
*/
@RequestMapping(value = "/image/{fileId}")
@ResponseBody public void getImage(@PathVariable String fileId, HttpServletResponse response) {
try {
GridFSDBFile gridfs = filesService.getFile(fileId);
response.setContentType(gridfs.getContentType());
OutputStream out = response.getOutputStream();
gridfs.writeTo(out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
源码下载:https://github.com/yinjihuan/cxytiandi
相关内容
-
微软Win10搜索Web内容强制使用Edge和Bing|windo
微软Win10搜索Web内容强制使用Edge和Bing|windows10自带的ed...
-
如何卸载系统自带的软件
如何卸载系统自带的软件,软件, ...
-
笔记本电脑自带的麦克风|笔记本电脑自带的麦克
笔记本电脑自带的麦克风|笔记本电脑自带的麦克风用不了,,1. 笔...
-
wps表格查找快捷键|wps表格查找快捷键华为平板
wps表格查找快捷键|wps表格查找快捷键华为平板有自带的绘画...
-
联想电脑主板自带硬盘|联想台式电脑怎么装硬盘
联想电脑主板自带硬盘|联想台式电脑怎么装硬盘,,1. 联想台式电...
-
win10无线网卡怎么创建移动热点?|win10自带的移
win10无线网卡怎么创建移动热点?|win10自带的移动热点要无线...
-
C上的引导检查文件系统:文件的类型
C上的引导检查文件系统:文件的类型,,故障现象:系统检查启动检查...
-
苹果外接键盘快捷键|苹果自带键盘快捷键
苹果外接键盘快捷键|苹果自带键盘快捷键,,1. 苹果自带键盘快捷...
-
电脑自带仿宋字体|电脑自带仿宋字体侵权吗?
电脑自带仿宋字体|电脑自带仿宋字体侵权吗?,,电脑自带仿宋字体...
-
win10繁体快捷键|win10自带输入法简繁体快捷键
win10繁体快捷键|win10自带输入法简繁体快捷键,,1. win10自带...
-
电脑自带画图如何剪切|电脑画图怎么剪切图片
电脑自带画图如何剪切|电脑画图怎么剪切图片,,电脑画图怎么剪...
-
电脑自带ie打开是空白的|ie8打开网页空白
电脑自带ie打开是空白的|ie8打开网页空白,,1. ie8打开网页空白...
-
剑网三技能宏怎么设置|剑网三自带宏
剑网三技能宏怎么设置|剑网三自带宏,,1. 剑网三技能宏怎么设置...
-
哪些电脑系统自带优酷|电脑优酷和手机优酷
哪些电脑系统自带优酷|电脑优酷和手机优酷,,1. 电脑优酷和手机...
-
电脑自带软件解压文件在哪个文件夹里|电脑自带
电脑自带软件解压文件在哪个文件夹里|电脑自带软件解压文件...