前言
刚刚接触到了MongoDB的分布式文件存储系统GridFs,以前没了解过,这里记录一下它的简单使用。
1、GridFs介绍
GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。
GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。
GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。
GridFS 可以更好的存储大于16M的文件。
2、工作原理
在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数据信息(文件名称、块大小、上传时间等信息)。从GridFS中读取文件要对文件的各各块进行组装、合并。
3、GridFs使用
(1)pom依赖
<!-- mongodb依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
Gridfs不用单独引用其他的依赖,直接用mongodb的依赖就可以了。
(2)配置文件
/*
* mongodb的配置
*/
@Configuration
public class MongodbConfig {
//注入配置信息中的数据库
@Value("${spring.data.mongodb.database}")
String database;
//注册GridFSBucket
@Bean
public GridFSBucket getGridFSBucket(MongoClient mongoClient) {
//获取数据库对象
MongoDatabase mongoDatabase = mongoClient.getDatabase(database);
//基于此数据库对象构建GridFSBucket对象
GridFSBucket gridFSBucket = GridFSBuckets.create(mongoDatabase);
return gridFSBucket;
}
}
这里向Spring容器中注册了一个GridFsBucket,下载会用到。
(3)测试
在测试包中直接写了:
@SpringBootTest
public class TestGridFs {
//注入gridfs模板
@Autowired
GridFsTemplate gridFsTemplate;
//注入gridfsBucket
@Autowired
GridFSBucket gridFSBucket;
//测试向mongodb中存文件
@Test
public void testGridfsSave() throws IOException {
//文件对象
File file = new File("d:/test.html");
//文件输入流对象
FileInputStream fileInputStream = new FileInputStream(file);
//使用gridfs模板来存文件
ObjectId objectId = gridFsTemplate.store(fileInputStream, "test.html");
if(objectId!=null) {
System.out.println("文件存储成功,ID是:" + objectId);
}
//关流
fileInputStream.close();
}
//测试下载文件
@Test
public void testDownloadFile() throws IllegalStateException, IOException {
//文件ID
String fileId = "5fe5bbce805d730e23d55b02";
//根据ID查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(
Query.query(
Criteria.where("_id").
is(fileId)));
if(gridFSFile!=null) {
//打开下载流对象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.
openDownloadStream(gridFSFile.getObjectId());
//获取流对象
GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
//获取输入流
InputStream inputStream = gridFsResource.getInputStream();
//保存的文件对象
File file = new File("F:/Users/Administrator/Desktop/test.html");
//输出流对象
OutputStream outputStream = new FileOutputStream(file);
//流复制
IOUtils.copy(inputStream, outputStream);
//关闭流
gridFSDownloadStream.close();
gridFSDownloadStream.close();
outputStream.close();
inputStream.close();
System.out.println("下载完成!");
}
}
//测试删除文件
@Test
public void testDelFile() {
String fileId = "5fe5bbce805d730e23d55b02";
//根据ID查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(
Query.query(
Criteria.where("_id").
is(fileId)));
if(gridFSFile!=null) {
//存在则删除
gridFsTemplate.delete(Query.query(
Criteria.where("_id").is(fileId)));
System.out.println("删除成功");
}
}
}
执行第一个测试方法:testGridfsSave,控制台输出如下:
查看数据库:
上传文件成功了。
执行第二个方法:testDownloadFile,控制台提示:
查看桌面:
下载成功。
接着执行第三个测试方法,测试删除,控制台提示:
查看数据库:
刚才上传的文件已经删除。
4、总结
使用GridFs可以很方便的对文件进行管理,尤其是那些html小文件存储起来非常便捷,大文件则要分块存储,刚接触,只明白简单的用法,相信它的功能远不止这么简单,以后继续深入了解。