一、前言和开发环境及配置
可以转载,但请注明出处。
之前自己写的SpringBoot整合MongoDB的聚合查询操作,感兴趣的可以点击查阅。
https://www.cnblogs.com/zaoyu/p/springboot-mongodb.html
使用mongodb存储文件并实现读取,通过springboot集成mongodb操作。
可以有两种实现方式:
1. 单个文件小于16MB的,可以直接把文件转成二进制或者使用如Base64编码对文件做编码转换,以二进制或者string格式存入mongodb。
读取时,把二进制数据或者string数据转成对应的IO流或做解码,再返回即可。
2. 对于单个文件大于16MB的,可以使用mongodb自带的GridFS
开发环境、工具:JDK1.8,IDEA 2021
Springboot版本:2.7.5
Mongodb依赖版本:4.6.1
SpringBoot的配置 application.properties 如下
# 应用名称 spring.application.name=demo #server.port=10086 不配置的话,默认8080 # springboot下mongoDB的配置参数。 spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 # 指定数据库库名 spring.data.mongodb.database=temp
二、实现步骤和代码
1. 小文件存储
1.1 说明和限制
由于MongoDB限制单个文档大小不能超过16MB,所以这种方式仅适用于单个文件小于16MB的。
如果传入大于16MB的文件,存储是会失败的,报错如下。
1.2 实现代码
package com.onepiece.mongo; import org.bson.Document; import org.bson.types.Binary; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import java.io.*; import java.util.Base64; import java.util.List; /** * @author zaoyu * @description 用于演示Mongodb的文件存储(单个文件不大于16MB) */ @SpringBootTest public class MongoSaveFiles { @Autowired private MongoTemplate mongoTemplate; // collection名 private String IMAGE_COLLECTION = "image"; // 源文件完整路径 private String FILE_PATH = "D:\\temp\\onepiece.jpg"; // 输出文件路径 private String FILE_OUTPUT_PATH = "C:\\Users\\onepiece\\Desktop\\"; // 限制16MB private Long FILE_SIZE_LIMIT = 16L * 1024L * 1024L; @Test public void saveFiles(){ byte[] fileContent = null; FileInputStream fis = null; try { File file = new File(FILE_PATH); long length = file.length(); // 校验文件大小,大于16MB返回。 这里的操作逻辑依据你自己业务需求调整即可。 if (length >= FILE_SIZE_LIMIT) { System.out.println("文件: " + file.getAbsolutePath() + " 超出单个文件16MB的限制。" ); return; } fileContent = new byte[(int) file.length()]; fis = new FileInputStream(file); // 读取整个文件 fis.read(fileContent); // 把文件内容以二进制格式写入到mongodb Document document = new Document(); // fileName字段、content字段自定义。 document.append("fileName", file.getName()); document.append("content", new Binary(fileContent)); Document insert = mongoTemplate.insert(document, IMAGE_COLLECTION); System.out.println("文件 " + file.getName() + " 已存入mongodb,对应ID是: " + insert.get("_id").toString()); } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 测试读取并写入到指定路径。 */ @Test public void readAndWriteFiles(){ // 这里也是,默认查所有,需要条件自行增加。 简单取1条验证。 List<Document> result = mongoTemplate.find(new Query(), Document.class, IMAGE_COLLECTION); Document document = result.get(0); // 取出存储的二进制数据,这里用binary.class处理。 Binary content = document.get("content", Binary.class); String fileName = document.get("fileName", String.class)