GridFS文件操作记录

GridFS

GridFS是一中大型文件存储在MongoDB的文件规范, 所有官方支持的驱动都实现了GridFS规范.
GridFS存储文件方式: 将文件分为多个块, 每个块作为一个单独的文档, 默认情况下, 每个块的大小为256K.
当GridFS获取文件时, MongoDB的驱动程序负责将多个块组装成完整的文件, 当不必要加载整个文件时, 你可以通过GridFS进行范围查询, 可以访问文件的任意部分.
应用场景:

  1. 如果你的文件系统限制目录下的文件数目, 可以使用MongoDB在目录下存储任意多的文件
  2. 当访问比较大的文件时, 想要访问文件的其中一部分(分段访问)
  3. 想要实现多个系统间文件和元数据同步
    注意:
    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”)));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值