GridFS
GridFS是一中大型文件存储在MongoDB的文件规范, 所有官方支持的驱动都实现了GridFS规范.
GridFS存储文件方式: 将文件分为多个块, 每个块作为一个单独的文档, 默认情况下, 每个块的大小为256K.
当GridFS获取文件时, MongoDB的驱动程序负责将多个块组装成完整的文件, 当不必要加载整个文件时, 你可以通过GridFS进行范围查询, 可以访问文件的任意部分.
应用场景:
- 如果你的文件系统限制目录下的文件数目, 可以使用MongoDB在目录下存储任意多的文件
- 当访问比较大的文件时, 想要访问文件的其中一部分(分段访问)
- 想要实现多个系统间文件和元数据同步
注意:
MongoDB不支持对文件多个快的跟新操作的原子性, 如果业务需要的话, 可以通过设置元数据的当前版本号来代码实现.
存储管理
GridFS使用两个集合保存数据, 一个集合存储文件块, 另外一个存储文件元数据.
具体为:
fs.files 用来存储文件的元数据(文件名称、块大小、上传时间…)
fs.chunks 用来存储文件内容信息(大的文件会被拆分成多个collection存储)
使用代码
使用场景: SpringCloud
1 . 配置MongoDB:
spring:
data:
mongodb:
uri: mongodb://root:123@localhost:27017
database: ***(数据库名)
2 .导入依赖
使用的是GridFsTemplate类, 该类已经封装在了org.springframewpork.data.mongodb中, 所以只需要导入MongoDB的依赖即可:
org.springframework.boot
spring-boot-starter-data-mongodb
3 .操作代码
@Autowired //声明对象
private GridFsTemplate gridFsTemplate;
存文件
File file = new File(“D:\**”); //根据文件地址, 创建要存的文件对象
FileInputStream fileInputStream = new FileInputStream(file); //创建文件输入流
ObjectId objectId = gridFsTemplate.store(fileInputStream, “存储后的文件名(collection的filename)”);
System.out.println(objectId);
方法源码:
public ObjectId store(InputStream content, String filename) {
return this.store(content, filename, (Object)null);
}
读取文件
MongoClient mongoClient = new MongoClient(); //创建MongoDB客户端对象
MongoDatabase database = mongoClient.getDatabase(db); //创建MongoDB数据库对象
GridFSBucket gridFSBucket = GridFSBuckets.create(database); //bucket 英[ˈbʌkɪt] 桶
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(“5dfdcc3cfd34cd07e066b71e”))); //通过 gridFsTemplate中的findone方法获取查询文件对象
GridFSDownloadStream gridFSDownloadStream =
gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
String toString = IOUtils.toString(gridFSDownloadStream, “UTF-8”);
System.out.println(toString);
你也可以将以上步骤封装:
@Configuration
public class MongoConfig {
@Value("${spring.data.mongodb.database}")
String db;
@Bean
public GridFSBucket getGridFSBucket(MongoClient mongoClient){
MongoDatabase database = mongoClient.getDatabase(db);
GridFSBucket gridFSBucket = GridFSBuckets.create(database);
return gridFSBucket;
}
}
删除文件
//根据文件id删除fs.files和fs.chunks中的记录 gridFsTemplate.delete(Query.query(Criteria.where("_id").is(“5b32480ed3a022164c4d2f92”)));