本文来说下如何自定义MongoDB的存储桶
概述
在使用MongoDB的GridFS的时候,默认存储文件的是fs的存储桶,如navicat所示
自定义MongoDB的存储桶
那么假如我使用自定义的存储桶pictureFs,该怎么设置呢?首先,查看一下我们通过注解使用的GridFsTemplate的源码,发现提供了构造参数。
public GridFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter, @Nullable String bucket) {
super(converter);
Assert.notNull(dbFactory, "MongoDbFactory must not be null!");
this.dbFactory = dbFactory;
// bucket为存储桶的名字
this.bucket = bucket;
}
那么不就是调用构造参数,传入bucket的值不就行了?
点进去查看MongoDbFactory和MongoConverter的源码,可知这两个都是接口,总所周知接口不能实例化,而且这两个参数不能为空,可以使用接口的实现类,然后接口实现类不止一个!细看源码,源码注释说的很清楚了,要使用已经给出了的,MongoDbFactory和MongoConverter。首先我们都知道,springboot的ioc依赖注入会把所有的bean类加载到bean容器,那么也就是说,我们可以从bean容器中取出这两个bean。
程序测试
MongoDBConfig
@Configuration
public class MongoDBConfig {
/***
* 自定义桶的名称
* @param dbFactory
* @param converter
* @return
*/
@Bean
public GridFsTemplate gridFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) {
return new GridFsTemplate(dbFactory, converter, "pictureFs");
}
}
文件上传
/**
* 通用上传单个
* 文件请求
*/
@SneakyThrows
@PostMapping("/uploadSingleFile")
@ApiOperation(value = "上传单个文件")
public ResponseBean<?> uploadSingleFile(MultipartFile file) {
// 新文件名
String originalFilename = file.getOriginalFilename();
// 获得文件输入流
InputStream ins = file.getInputStream();
// 获得文件类型
String contentType = file.getContentType();
// 将文件存储到mongodb中,mongodb将会返回这个文件的具体信息
// ObjectId objectId = gridFsTemplate.store(ins, originalFilename, contentType);
// 上传文件中我们也可以使用DBObject附加一些属性
DBObject metadata = new BasicDBObject();
metadata.put("hello","word");
ObjectId objectId = gridFsTemplate.store(ins, originalFilename, contentType, metadata);
log.info(objectId.toString());
log.info("接收文件:" + originalFilename);
//返回信息
return new ResponseBean<>(200, "上传成功", objectId.toString());
}
程序结果
本文小结
本文介绍了如何自定义MongoDB的存储桶,后续会对mongodb相关的知识与内容进行持续深入的介绍。