什么是GridFS?
GridFS介绍
GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用MongoDB存储数据,使用GridFS可以快速集成
开发。
它的工作原理是:
在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合
(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数
据信息(文件名称、块大小、上传时间等信息)。
从GridFS中读取文件要对文件的各各块进行组装、合并。
GridFS是持久化存储文件的模块,并不是以往仅仅储存一个文件名和地址,然后获取文件名和地址根据名字找到对应的本地文件展示。。。。。。它是把文件以二进制的形式分块进行持久化了
GridFS储存文件流程:
存储原理说明:
1、文件存储成功得到一个文件id
2、此文件id是fs.files集合中的主键。
3、可以通过文件id查询fs.chunks表中的记录,得到文件的内容。
GridFS取文件流程:
取出文件原理说明:
1、根据文件ID在chunks集合中查询到该模板相关的二进制文件
2、将相关二进制文件组装、合并,通过GridFSBucket对象打开下载流,获取文件流
文件取出的GridFSBucket配置
package com.xuecheng.manage_cms.config;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Huang
* @version 1.0
* @date 2020/3/30 16:48
*/
@Configuration
public class MongoConfig {
//获取yml文件中的连接数据库
@Value("${spring.data.mongodb.database}")
String db;
//根据连接的数据库获取相应的GridFSBucket对象
//GridFSBucket的作用:用于打开下载流对象
@Bean
public GridFSBucket getGridFSBucket(MongoClient mongoClient){
MongoDatabase database = mongoClient.getDatabase(db);
GridFSBucket bucket = GridFSBuckets.create(database);
return bucket;
}
}
文件储存、取出、删除代码:
package com.xuecheng.manage_cms.dao;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @author Huang
* @version 1.0
* @date 2020/3/30 15:21
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class GirdFsTest {
@Autowired
GridFsTemplate gridFsTemplate;
@Autowired
GridFSBucket gridFSBucket;
//存文件
@Test
public void test01() throws FileNotFoundException {
//获取模板文件的文件指针
File file = new File("d:/index_banner.ftl");
//用文件输入流获取对文件内容的操作
FileInputStream fileInputStream = new FileInputStream(file);
//GridFs将文件储存后返回ID,表示该文件数据的主键
ObjectId objectId = gridFsTemplate.store(fileInputStream, "index_banner.ftl");
//打印ID
System.out.println("objectId:" + objectId);
}
//取文件
@Test
public void test02() throws IOException {
//根据文件ID查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5e81a73142439429249fe6b4")));
//打开一个下载流对象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
//创建gridFsResource,用于获取流对象
GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
//从流中读取数据
String content = IOUtils.toString(gridFsResource.getInputStream(), "utf-8");
//打印文件内容
System.out.println(content);
}
//删除文件
@Test
public void testDelFile() throws IOException {
//根据文件id删除fs.files和fs.chunks中的记录
gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5e81a73142439429249fe6b4")));
}
}
注:取出的文件是字符串形式,是页面模板的内容,此时可根据此模板字符串与数据模型结合形成静态页面------参考
FreeMarker自动页面静态化生成html文件https://blog.csdn.net/qq_42039738/article/details/105168742