最近在写一个项目,用到了mongoDB存储文件的模块GridFs,记录一下。
GridFs总结:GridFs是mongoDB存储文件一个模块,将文件分块进行存储,文件会按照256K的大小分割成多个块,每一块都生成一条记录存入mongoDB数据库的fs.chunks集合中,每一条记录都是对应文件的二进制数据。然后将文件的一些信息存放到fs.files集合中,如文件名称、上传时间、文件大小等。
- 创建配置类,创建bean并注入到容器中,作用是连接指定mongoDB数据库并打开下载流。
db绑定的是配置文件中配置的mongoDB的数据库名称
- 测试代码如下:
@SpringBootTest
@RunWith(SpringRunner.class)
public class GridFsTest {
@Autowired
GridFsTemplate gridFsTemplate;
@Autowired
GridFSBucket gridFSBucket;
/**
* GridFs存储文件的测试
* 将文件按大小256k分割存到mongodb数据库
* 将分割后的文件分记录存到fs.files表
* 将完整文件信息存到fs.chunks表
*
* @throws FileNotFoundException
*/
@Test
public void testGridFs() throws FileNotFoundException {
//获取要存储的文件
File file = new File("D:/index_banner.html");
//将要存储的文件写入输入流
FileInputStream fileInputStream = new FileInputStream(file);
//文件开始存储
ObjectId objectId = gridFsTemplate.store(fileInputStream, "轮播图测试文件01", "");
//获取存储的文件id
String fileId = objectId.toString();
System.out.println(fileId);
}
/**
* GridFs读取文件的测试
* 读取数据库中的文件,以字符形式展示
*
* @throws IOException
*/
@Test
public void getFile() throws IOException {
//根据文件id查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5a7719d76abb5042987eec3a")));
//使用GridFsBucket打开一个下载流对象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
//创建GridFsResource对象,获取流
GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
//从流中取数据
String s = IOUtils.toString(gridFsResource.getInputStream(), "UTF-8");
System.out.println(s);
}
/**
* GridFs删除文件的测试
*/
@Test
public void deleteFile(){
//根据文件id删除fs.files表和fs.chunks表中的记录
gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5d833df93ca78f04a8f3d8cb")));
}
}
- 使用mongoDB的图形化工具Studio 3T操作文件。
文件的数据被存放到集合fs.chunks中,打开该集合,找到data字段,即为存放的具体数据,可以导入和导出数据。
导入数据的注意项:导入数据之后,数据长度改变,要更新fs.files表中对应的length字段数据