赞
踩
MongoDB 是一个灵活的 NoSQL 数据库,能够存储大量的数据。但是,当涉及到特别大的数据项,比如大文件、视频或大型图片时,MongoDB 提供了一个特殊的方法来存储这些数据:GridFS。
GridFS 是 MongoDB 提供的一个规范和工具集,用于将大文件切分成多个较小的数据块并存储在 MongoDB 中。默认情况下,GridFS 将文件分成 255 KB 的数据块进行存储。
当你使用 GridFS 存储文件时:
chunks
集合中。files
集合中。如果你有一个超过 BSON 文档大小限制(16MB)的文件或数据,那么 GridFS 是一个理想的解决方案。即使不超过这个限制,GridFS 也对于存储大量需要快速随机访问的数据非常有用。
性能:由于 GridFS 将大文件切分成较小的数据块,所以可以非常快速地访问文件的任意部分,而不需要加载整个文件。
扩展性:MongoDB 和 GridFS 设计得非常适合扩展,所以你可以轻松地在集群上存储和管理大量的大文件。
使用 Java 的 MongoTemplate
来与 MongoDB 交互。想和GridFS 交互,你可以使用 GridFsTemplate
。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
GridFsTemplate
在你的 Spring 配置中,你可以配置 GridFsTemplate
bean。
@Configuration
public class GridFsConfig {
@Bean
public GridFsTemplate gridFsTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter) {
return new GridFsTemplate(mongoDbFactory, mongoConverter);
}
}
GridFsTemplate
存储文件你可以使用 GridFsTemplate
的 store
方法来存储文件。
@Autowired
private GridFsTemplate gridFsTemplate;
public String addGridFs(InputStream content, String filename){
ObjectId objectId = gridFsTemplate.store(content, filename);
return objectId.toHexString();
}
GridFsTemplate
检索文件为了从 GridFS 中检索文件,你可以使用 findOne
方法。
public InputStream getFile(String id) throws IOException { GridFSFile file = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id))); if (file != null) { GridFsResource resource = gridFsTemplate.getResource(file); return resource.getInputStream(); } return null; } //根据名称查询多个文件 public List<InputStream> getFilesByName(String name) throws IOException { List<InputStream> inputStreams = new ArrayList<>(); Query query = new Query(Criteria.where("filename").is(name)); List<GridFSFile> files = gridFsTemplate.find(query).into(new ArrayList<>()); for (GridFSFile file : files) { GridFsResource resource = gridFsTemplate.getResource(file); InputStream inputStream = resource.getInputStream(); if (inputStream != null) { inputStreams.add(inputStream); } } return inputStreams; }
//根据名称
public void deleteFile(String filename) {
gridFsTemplate.delete(new Query(Criteria.where("filename").is(filename)));
}
public void deleteFile(String id) {
gridFsTemplate.delete(new Query(Criteria.where("_id").is(id)));
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。