1.MongoConfig
@Configuration
public class MongoConfig {
@Resource
private MongoConverter converter;
@Resource
private MongoDatabaseFactory dbFactory;
@Resource
private MongoTemplate mongoTemplate;
@Bean("gridFsBucketDoc")
public GridFSBucket getGridFSBucketDoc() {
MongoDatabase db = mongoTemplate.getDb();
return GridFSBuckets.create(db, "doc_fs");
}
@Bean("gridFsBucketPic")
public GridFSBucket getGridFSBucketPic() {
MongoDatabase db = mongoTemplate.getDb();
return GridFSBuckets.create(db, "pic_fs");
}
@Bean("gridFsTemplatePic")
public GridFsTemplate getGridFsTemplatePic() {
GridFsTemplate gridFsTemplate = new GridFsTemplate(dbFactory, converter, "pic_fs");
return gridFsTemplate;
}
@Bean("gridFsTemplateDoc")
public GridFsTemplate getGridFsTemplateDoc() {
GridFsTemplate gridFsTemplate = new GridFsTemplate(dbFactory, converter, "doc_fs");
return gridFsTemplate;
}
}
2.application.yml
spring:
servlet:
multipart:
max-file-size: 100MB #单个文件上传大小
max-request-size: 200MB #连续上传文件大小
#mongo配置-单机
data:
mongodb:
host: 127.0.0.1
port: 27017
database: test
username: root
password: "123456" #纯数字密码需要带双引号,否则报错
authentication-database: admin
# gridfs:
# bucket: mms_fs #配置该属性就会创建同名的gridfs bucket: mms_fs. 不配置创建默认的bucket: fs
3.GridFsService
@Service
public class GridFsService {
private static final Logger log = LoggerFactory.getLogger(GridFsService.class);
@Resource(name = "gridFsBucketDoc")
private GridFSBucket gridFSBucket;
@Resource(name = "gridFsTemplateDoc")
private GridFsTemplate gridFsTemplate;
@SneakyThrows
public ObjectId uploadFile(MultipartFile file) {
String contentType = file.getContentType();
String filename = file.getOriginalFilename();
InputStream inputStream = file.getInputStream();
DBObject metadata = new BasicDBObject();
metadata.put("name", "mms");
return gridFsTemplate.store(inputStream, filename, contentType, metadata);
}
public GridFSFile getFileById(String fileId) {
Query query = Query.query(Criteria.where("_id").is(fileId));
GridFSFile gridFsFile = gridFsTemplate.findOne(query);
String key = (String) gridFsFile.getMetadata().get("name");
log.info("gridFsFile metadata key: {}", key);
return gridFsFile;
}
public void deleteFileById(String fileId) {
Query query = Query.query(Criteria.where("_id").is(fileId));
GridFSFile file = gridFsTemplate.findOne(query);
if (null == file) {
log.info("文件删除失败,文件不存在");
return;
}
gridFsTemplate.delete(query);
}
@SneakyThrows
public byte[] downloadFileByIdToBrowser(String fileId, HttpServletResponse response) {
Query query = Query.query(Criteria.where("_id").is(fileId));
GridFSFile gridFsFile = gridFsTemplate.findOne(query);
String name = new String(gridFsFile.getFilename().getBytes("GBK"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment;fileName=" + name);
GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(gridFsFile.getObjectId());
GridFsResource gridResource = new GridFsResource(gridFsFile, downloadStream);
log.info(gridFsFile.getFilename() + ">>文件下载成功!!");
return IoUtil.readBytes(gridResource.getInputStream());
}
@SneakyThrows
public void downloadFileByIdToDir(String fileId, String filePath) {
Query query = Query.query(Criteria.where("_id").is(fileId));
GridFSFile gridFsFile = gridFsTemplate.findOne(query);
GridFsResource resource = gridFsTemplate.getResource(gridFsFile);
File file = new File(filePath);
FileOutputStream outputStream = new FileOutputStream(file);
IoUtil.copy(resource.getInputStream(), outputStream);
outputStream.close();
log.info(gridFsFile.getFilename() + ">>文件下载成功!!");
}
}
4.技术背景