spring boot 集成mongodb这里就不写了。
1、增加配置类,启动类里别忘了导入
package com.viewhigh.gov;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
public class MongodbConfig {
@Value("${spring.data.mongodb.database}")
String db;
//GridFSBucket用于打开下载流
@Bean
public GridFSBucket getGridFSBucket(MongoClient mongoClient) {
MongoDatabase database = mongoClient.getDatabase(db);
GridFSBucket gridFSBucket = GridFSBuckets.create(database);
return gridFSBucket;
}
}
2、实现类:
package com.viewhigh.gov.mongodb.controller;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.viewhigh.gov.utils.result.R;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* @author : maybesuch
* @version : 1.0
* @Description : GridFS文件基本操作
* @Date : 2020/1/8 10:16
* @Copyright : Copyright (c) 2020 All Rights Reserved
**/
@RestController
@RequestMapping("/gridfs")
public class GridFSController {
@Autowired
private GridFsTemplate gridFsTemplate;
@Autowired
GridFSBucket gridFSBucket;
/**
* 上传文件
*
* @param multipartFile 文件
* @return 上传成功文件id
*/
@PostMapping("/upload")
public R uploadFile(@RequestParam(value = "file") MultipartFile multipartFile) {
// 设置meta数据值
Map<String, String> metaData = new HashMap<>();
metaData.put("tags", "test");
// ...
try (
InputStream inputStream = multipartFile.getInputStream();
) {
// 获取文件的源名称
String fileName = multipartFile.getOriginalFilename();
Long size = multipartFile.getSize();
// 进行文件存储
ObjectId objectId = gridFsTemplate.store(inputStream, fileName, metaData);
// 返回文件的id
HashMap<String,String> result = new HashMap<String,String>();
result.put("accessoryName",fileName);
result.put("accessorySize",String.valueOf(size));
result.put("mongodbId",String.valueOf(objectId));
return R.ok().put("data",result);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// /**
// * 获取文件信息
// * @param fileId 文件id
// **/
// @PostMapping("/get/{fileId}")
// public void getFile(@PathVariable("fileId") String fileId) {
//
// //根据id查询文件
// GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
//
// if (gridFSFile == null) {
// throw new RuntimeException("No file with id: " + fileId);
// }
// //获取流对象
// GridFsResource resource = gridFsTemplate.getResource(gridFSFile);
//
// /*可根据实际需求进行数据的获取*/
// try {
// //获取流中的数据
// String content = IOUtils.toString(resource.getInputStream(), "UTF-8");
// //获取byte[]信息
// byte[] bytes = IOUtils.toByteArray(resource.getInputStream());
//
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
//下载文件
@RequestMapping(value = "/downloadFile")
public void downloadFile(@RequestParam(name = "mongodbId") String fileId, HttpServletRequest request, HttpServletResponse response) throws Exception {
Query query = Query.query(Criteria.where("_id").is(fileId));
// 查询单个文件
GridFSFile gfsFile = gridFsTemplate.findOne(query);
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gfsFile.getObjectId());
//创建GridFsResource对象,获取流
GridFsResource gridFsResource = new GridFsResource(gfsFile, gridFSDownloadStream);
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 + "\"");
response.addHeader("content-type","application/octet-stream");
IOUtils.copy(gridFsResource.getInputStream(),response.getOutputStream());
}
/**
* 删除文件
* @param fileId 文件id
*/
@PostMapping("/delete")
public void deleteFile(@RequestParam(value = "mongodbId") String fileId) {
// 根据文件id删除fs.files和fs.chunks中的记录
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId)));
}
}