前言
刚刚接触到了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@Beanpublic 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模板@AutowiredGridFsTemplate gridFsTemplate;//注入gridfsBucket@AutowiredGridFSBucket gridFSBucket;//测试向mongodb中存文件@Testpublic 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();}//测试下载文件@Testpublic void testDownloadFile() throws IllegalStateException, IOException {//文件IDString 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("下载完成!");}}//测试删除文件@Testpublic 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小文件存储起来非常便捷,大文件则要分块存储,刚接触,只明白简单的用法,相信它的功能远不止这么简单,以后继续深入了解。