spring boot 整合mogodb
步骤:
很简单 分三部
- 导包
- 在application.yml 中配置mongodb的连接信息
- 编写GridFSBucket bean GridFSBucket用于操作文件
步骤一
查看官方文档 按官方文档导入包即可 https://docs.mongodb.com/drivers/java/sync/v4.3/quick-start/
遇到的错误
启动自动抛出 java.lang.ClassNotFoundException: com.mongodb.connection.BufferProvider
错误原因: 导入的包不对 一定要根据官方文档导包 视频教程有误
步骤二
编写配置配置文件
uri格式mongodb://username:password@ip:port
没有什么好说的 类似mysql 配置uri和数据库即可
data:
mongodb:
uri: mongodb://lyra:365373011@127.0.0.1:27017
database: news
步骤三
编写配置类
主体思路:
- 用MongoClient 根据数据库名称获得数据库对象
- 根据数据库对象创建
GridFSBucket
对象
遇到的错误
使用@value注入字符串时未加$符号 未注入成功
@Configuration
public class GridFSConfig {
@Value("${spring.data.mongodb.database}")
private String databaseName;
@Bean
public GridFSBucket gridFSBucket(MongoClient mongoClient) {
MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
return GridFSBuckets.create(mongoDatabase);
}
}
图片入库
业务逻辑:
- 首先判断base64字符串是否存在
- 将base64字符串转成InputStream对象
- 因为一个用户只需要使用一张面部图片 不需要多张 又因为用户名也是唯一的 直接使用用户名做为文件名即可 文件类型为png
- 将文件的主键返回给用户
因为 JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用 所以得使用Base64.Decoder decoder = Base64.getDecoder();
获取解码对象
然后根据byte数组进行构建inputStream对象
if (adminBO.getImg64() == null) {
GraceException.display(ResponseStatusEnum.UPLOAD_IMAGE_BASE64_ISNULL);
}
Base64.Decoder decoder = Base64.getDecoder();
byte[] imageBytes = decoder.decode(adminBO.getImg64());
InputStream inputStream = new ByteArrayInputStream(imageBytes);
根据inputSteam和用户名进行上传文件操作
ObjectId objectId = gridFSBucket.uploadFromStream(adminBO.getUsername() + ".png", inputStream);
最后返回没什么好说的
@Override
public GraceJSONResult uploadToGridFS(AdminBO adminBO) {
if (adminBO.getImg64() == null) {
GraceException.display(ResponseStatusEnum.UPLOAD_IMAGE_BASE64_ISNULL);
}
Base64.Decoder decoder = Base64.getDecoder();
byte[] imageBytes = decoder.decode(adminBO.getImg64());
InputStream inputStream = new ByteArrayInputStream(imageBytes);
ObjectId objectId = gridFSBucket.uploadFromStream(adminBO.getUsername() + ".png", inputStream);
return GraceJSONResult.ok(objectId.toString());
}