MongoDB文件上传和下载

前台上传文件或者后台生成文件直接上传到MongoDB数据库,然后根据MongoDB的_id下载文件

引入依赖

1
2
3
4
5
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>

GridFS对象

1
2
@Autowired
private GridFsTemplate gridFsTemplate;

文件上传

1
2
3
4
5
6
7
8
9
10
11
public String uploadFile(MultipartFile file) throws Exception {
// 获得提交的文件名
String fileName = file.getOriginalFilename();
// 获得文件输入流
InputStream ins = file.getInputStream();
// 获得文件类型
String contentType = file.getContentType();
// 将文件存储到mongodb中,mongodb 将会返回这个文件的具体信息
ObjectId gridFSFile = gridFsTemplate.store(ins, fileName, contentType);
return gridFSFile.toString();
}

文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void downloadFile(@RequestParam(name = "file_id") String fileId, HttpServletRequest request, HttpServletResponse response) throws Exception {
Query query = Query.query(Criteria.where("_id").is(fileId));
// 查询单个文件
GridFsFile gfsFile = gridFsTemplate.findOne(query);
GridFsResource gridFsResource=new GridFsResource(gfsFile, GridFsBuckets.create(mongoDbFactory.getDb)).openDownloadStream(gfsFile.getObjectId()));
String fileName = gfsfile.getFilename().replace(",", "");
//处理中文文件名乱码
if (request.getHeader("User-Agent").toUpperCase().contains("MSIE") ||
request.getHeader("User-Agent").toUpperCase().contains("TRIDENT")
|| request.getHeader("User-Agent").toUpperCase().contains("EDGE")) {
fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
} else {
//非IE浏览器的处理:
fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
// 通知浏览器进行文件下载
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
IOUtils.copy(gridFsResource.getInputStream(),response.getOutputStream());
}

删除文件

1
2
3
4
5
6
7
8
9
10
public Object deleteFile(@RequestParam(name = "file_id") String fileId) {
Query query = Query.query(Criteria.where("_id").is(fileId));
// 查询单个文件
GridFSDBFile gfsfile = gridFsTemplate.findOne(query);
if (gfsfile == null) {
return ServiceResultHelper.genResultWithFaild(Constant.ErrorCode.FILE_NOT_EXIST_ERROR_MSG, Constant.ErrorCode.FILE_NOT_EXIST_ERROR);
}
gridFsTemplate.delete(query);
return ServiceResultHelper.genResultWithSuccess();
}