・这里记录并分享两种存储方式,具体使用那种可以根据业务和所存文件大小来选择*
・当你所存储的文件都小于16M的时候可以选择第一种方式进程文件存储,当文件大于16M的时候就要选择第二种GridFS方式进行存储
・我两种方式都有测试过,但是感觉在相同文件下存储速度第一种会更快一些,我不知道是哪里的问题,有知道的大佬还请指定指定
额,写博客只为分享交流并记录一下,如果有什么错误的地方还希望各位批评指正
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
方法一
使用BSON(Binary JSON:二进制JSON)格式来存储数据。
创建实体类UploadFile
@Data
@Document
public class UploadFile {
@Id
private String id;
// 文件名
private String name;
// 上传时间
private Date createdTime;
// 文件内容
private Binary content;
// 文件类型
private String contentType;
// 文件大小
private long size;
}
具体方法
@Autowired
private MongoTemplate mongoTemplate;
public static String uploadFile(File file){
String fileName = file.getName();
FileInputStream is = null;
try {
is = new FileInputStream(file);
byte[] idImgBytes = new byte[(int)file.length()];
is.read(idImgBytes);
UploadFile uploadFile = new UploadFile();
uploadFile.setName(fileName);
uploadFile.setCreatedTime(new Date());
uploadFile.setContent(new Binary(idImgBytes));
uploadFile.setContentType(fileName.substring(fileName.lastIndexOf(".")));
uploadFile.setSize(file.length());
UploadFile savedFile = mongoTemplate.save(uploadFile);
return savedFile.getId();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
上传成功返回id,失败返回null
方法二
GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件。
@Autowired
private GridFsTemplate gridFsTemplate;
public static String uploadFileToMongo(File file) {
try {
String fileName = file.getName();
// 获得文件输入流
InputStream ins = new FileInputStream(file);
// 获得文件类型
String contentType = fileName.substring(fileName.lastIndexOf(".") + 1);
// 将文件存储到mongodb中,mongodb 将会返回这个文件的具体信息
ObjectId store = gridFsTemplate.store(ins, fileName, contentType);
return store.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}