新增mongo版文件业务,实现minio多系统统一文件管理

This commit is contained in:
wanggeng 2021-12-12 23:04:35 +08:00
parent 7acb9711cd
commit 54a6a6c311
13 changed files with 511 additions and 283 deletions

View File

@ -0,0 +1,65 @@
package ink.wgink.interfaces.file;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.pos.FilePO;
import ink.wgink.pojo.result.SuccessResultList;
import java.util.List;
/**
* @ClassName: IMongoFileService
* @Description: Mongo文件业务
* @Author: wanggeng
* @Date: 2021/12/12 6:16 PM
* @Version: 1.0
*/
public interface IMongoFileService {
String UPLOAD_FILE_COLLECTION_NAME = "uploadFiles";
/**
* 保存文件
*
* @param filePO
*/
void saveByUserId(String userId, FilePO filePO);
/**
* 删除文件
*
* @param fileIds 文件ID列表
*/
void delete(List<String> fileIds);
/**
* 文件详情
*
* @param fileId
* @return
*/
FilePO getPO(String fileId);
/**
* 文件分页列表
*
* @param page
* @return
*/
SuccessResultList<List<FilePO>> listPage(ListPage page);
/**
* 文件列表
*
* @param fileIds
* @return
*/
List<FilePO> listByIds(List<String> fileIds);
/**
* 文件列表
*
* @param fileUrl 文件url
* @return
*/
List<FilePO> listByUrl(String fileUrl);
}

View File

@ -17,7 +17,7 @@ public class FilePO implements Serializable {
private String filePath; private String filePath;
private String fileUrl; private String fileUrl;
private String fileType; private String fileType;
private String fileSize; private Long fileSize;
private String fileSummary; private String fileSummary;
private Integer isBack; private Integer isBack;
private String creator; private String creator;
@ -66,11 +66,11 @@ public class FilePO implements Serializable {
this.fileType = fileType; this.fileType = fileType;
} }
public String getFileSize() { public Long getFileSize() {
return fileSize == null ? "" : fileSize.trim(); return fileSize == null ? 0 : fileSize;
} }
public void setFileSize(String fileSize) { public void setFileSize(Long fileSize) {
this.fileSize = fileSize; this.fileSize = fileSize;
} }
@ -83,7 +83,7 @@ public class FilePO implements Serializable {
} }
public Integer getIsBack() { public Integer getIsBack() {
return isBack; return isBack == null ? 0 : isBack;
} }
public void setIsBack(Integer isBack) { public void setIsBack(Integer isBack) {
@ -123,7 +123,7 @@ public class FilePO implements Serializable {
} }
public Integer getIsDelete() { public Integer getIsDelete() {
return isDelete; return isDelete == null ? 0 : isDelete;
} }
public void setIsDelete(Integer isDelete) { public void setIsDelete(Integer isDelete) {

View File

@ -37,7 +37,6 @@
<dependency> <dependency>
<groupId>org.springframework.data</groupId> <groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId> <artifactId>spring-data-mongodb</artifactId>
<scope>provided</scope>
</dependency> </dependency>
<!-- mongodb end --> <!-- mongodb end -->

View File

@ -1,5 +1,7 @@
package ink.wgink.module.file.pojo.vos; package ink.wgink.module.file.pojo.vos;
import ink.wgink.pojo.pos.FilePO;
/** /**
* When you feel like quitting. Think about why you started * When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始 * 当你想要放弃的时候想想当初你为何开始
@ -10,79 +12,6 @@ package ink.wgink.module.file.pojo.vos;
* @Date: 2021/3/15 11:39 上午 * @Date: 2021/3/15 11:39 上午
* @Version: 1.0 * @Version: 1.0
*/ */
public class FileVO { public class FileVO extends FilePO {
String fileName;
String filePath;
String fileFullPath;
String fileUrl;
String fileType;
Long fileSize;
public String getFileName() {
return fileName == null ? "" : fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFilePath() {
return filePath == null ? "" : filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFileFullPath() {
return fileFullPath == null ? "" : fileFullPath;
}
public void setFileFullPath(String fileFullPath) {
this.fileFullPath = fileFullPath;
}
public String getFileUrl() {
return fileUrl == null ? "" : fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
public String getFileType() {
return fileType == null ? "" : fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public Long getFileSize() {
return fileSize == null ? 0 : fileSize;
}
public void setFileSize(Long fileSize) {
this.fileSize = fileSize;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"fileName\":\"")
.append(fileName).append('\"');
sb.append(",\"filePath\":\"")
.append(filePath).append('\"');
sb.append(",\"fileFullPath\":\"")
.append(fileFullPath).append('\"');
sb.append(",\"fileUrl\":\"")
.append(fileUrl).append('\"');
sb.append(",\"fileType\":\"")
.append(fileType).append('\"');
sb.append(",\"fileSize\":")
.append(fileSize);
sb.append('}');
return sb.toString();
}
} }

View File

@ -25,6 +25,20 @@ import java.util.Map;
*/ */
public interface IDefaultFileService { public interface IDefaultFileService {
/**
* 保存文件
*
* @param fileVO
*/
void saveFile(FileVO fileVO);
/**
* 保存文件
*
* @param userId
* @param fileVO
* @return
*/
String saveFileByUserId(String userId, FileVO fileVO); String saveFileByUserId(String userId, FileVO fileVO);
/** /**
@ -48,6 +62,11 @@ public interface IDefaultFileService {
*/ */
void uploadFileByUserId(String userId, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params); void uploadFileByUserId(String userId, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params);
/**
* 删除文件
*
* @param ids
*/
void remove(List<String> ids); void remove(List<String> ids);
/** /**
@ -89,17 +108,6 @@ public interface IDefaultFileService {
*/ */
void saveUploadFileInfoByUserId(String userId, String fileName, String uploadPath, String uploadFileName, String fileType, long fileSize, Map<String, Object> params); void saveUploadFileInfoByUserId(String userId, String fileName, String uploadPath, String uploadFileName, String fileType, long fileSize, Map<String, Object> params);
/**
* 获取上传文件路径
*
* @param baseUploadPath
* @param uploadTypeEnum
* @param fileType
* @return
* @throws FileException
*/
String getUploadPath(String baseUploadPath, UploadTypeEnum uploadTypeEnum, String fileType) throws FileException;
/** /**
* 下载文件 * 下载文件
* *
@ -122,14 +130,55 @@ public interface IDefaultFileService {
*/ */
boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange); boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange);
/**
* 获取上传文件路径
*
* @param baseUploadPath
* @param uploadTypeEnum
* @param fileType
* @return
* @throws FileException
*/
String getUploadPath(String baseUploadPath, UploadTypeEnum uploadTypeEnum, String fileType) throws FileException;
/**
* 文件分页列表
*
* @param page
* @return
*/
SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page); SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page);
/**
* 文件列表
*
* @param idList
* @return
*/
List<FileDTO> list(List<String> idList); List<FileDTO> list(List<String> idList);
/**
* 文件列表
*
* @param idList
* @return
*/
List<FilePO> listPO(List<String> idList); List<FilePO> listPO(List<String> idList);
/**
* 文件详情
*
* @param fileId
* @return
*/
FilePO getPO(String fileId); FilePO getPO(String fileId);
/**
* 文件列表
*
* @param url 文件url
* @return
*/
List<FileDTO> listByUrl(String url); List<FileDTO> listByUrl(String url);
} }

View File

@ -92,14 +92,6 @@ public interface IFileService {
*/ */
String saveFileByUserId(String userId, FileVO fileVO); String saveFileByUserId(String userId, FileVO fileVO);
/**
* 文件分页列表
*
* @param page
* @return
*/
SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page);
/** /**
* 删除记录 * 删除记录
* *
@ -174,6 +166,16 @@ public interface IFileService {
*/ */
FileDTO uploadSingleForFileDTO(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params); FileDTO uploadSingleForFileDTO(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params);
/**
* 保存导入Excel异常文件信息
*
* @param fileName
* @param uploadPath
* @param fileSize
* @param params
*/
void uploadErrorExcelFileInfo(String fileName, String uploadPath, long fileSize, Map<String, Object> params);
/** /**
* 文件下载 * 文件下载
* *
@ -231,16 +233,6 @@ public interface IFileService {
@Deprecated @Deprecated
FilePO getPO(Map<String, Object> params); FilePO getPO(Map<String, Object> params);
/**
* 保存导入Excel异常文件信息
*
* @param fileName
* @param uploadPath
* @param fileSize
* @param params
*/
void uploadErrorExcelFileInfo(String fileName, String uploadPath, long fileSize, Map<String, Object> params);
/** /**
* 获取导入Excel异常文件路径 * 获取导入Excel异常文件路径
* *
@ -264,4 +256,12 @@ public interface IFileService {
*/ */
List<FilePO> listPO(List<String> idList); List<FilePO> listPO(List<String> idList);
/**
* 文件分页列表
*
* @param page
* @return
*/
SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page);
} }

View File

@ -23,8 +23,20 @@ import java.util.Map;
*/ */
public interface IMinIoFileService { public interface IMinIoFileService {
/**
* 保存
*
* @param userId
* @param fileVO
* @return
*/
String saveFileByUserId(String userId, FileVO fileVO); String saveFileByUserId(String userId, FileVO fileVO);
/**
* 删除
*
* @param ids
*/
void remove(List<String> ids); void remove(List<String> ids);
/** /**
@ -76,13 +88,43 @@ public interface IMinIoFileService {
*/ */
boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange); boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange);
/**
* 文件分页列表
*
* @param page
* @return
*/
SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page); SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page);
/**
* 文件列表
*
* @param idList
* @return
*/
List<FileDTO> list(List<String> idList); List<FileDTO> list(List<String> idList);
/**
* 文件列表
*
* @param idList
* @return
*/
List<FilePO> listPO(List<String> idList); List<FilePO> listPO(List<String> idList);
/**
* 详情
*
* @param fileId
* @return
*/
FilePO getPO(String fileId); FilePO getPO(String fileId);
/**
* 文件列表
*
* @param fileUrl
* @return
*/
List<FileDTO> listByUrl(String fileUrl); List<FileDTO> listByUrl(String fileUrl);
} }

View File

@ -64,13 +64,30 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau
private String[] audioTypes; private String[] audioTypes;
private String[] fileTypes; private String[] fileTypes;
@Override
public void saveFile(FileVO fileVO) {
fileDao.save(HashMapUtil.beanToMap(fileVO));
}
@Override @Override
public String saveFileByUserId(String userId, FileVO fileVO) { public String saveFileByUserId(String userId, FileVO fileVO) {
String fileId = UUIDUtil.getUUID(); String fileId;
if (StringUtils.isBlank(fileVO.getFileId())) {
fileId = UUIDUtil.getUUID();
fileVO.setFileId(fileId);
} else {
fileId = fileVO.getFileId();
}
if (StringUtils.isBlank(fileVO.getGmtCreate())) {
String dateTime = DateUtil.getTime();
fileVO.setGmtCreate(dateTime);
fileVO.setGmtModified(dateTime);
}
if (StringUtils.isBlank(fileVO.getCreator())) {
fileVO.setCreator(userId);
fileVO.setModifier(userId);
}
Map<String, Object> params = HashMapUtil.beanToMap(fileVO); Map<String, Object> params = HashMapUtil.beanToMap(fileVO);
params.put("fileId", fileId);
params.put("isBack", 0);
setSaveInfoByUserId(params, userId);
fileDao.save(params); fileDao.save(params);
return fileId; return fileId;
} }
@ -327,7 +344,7 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau
OutputStream outputStream = response.getOutputStream(); OutputStream outputStream = response.getOutputStream();
WritableByteChannel writableByteChannel = Channels.newChannel(outputStream); WritableByteChannel writableByteChannel = Channels.newChannel(outputStream);
) { ) {
response.setHeader("Content-Length", filePO.getFileSize()); response.setHeader("Content-Length", filePO.getFileSize().toString());
response.setContentType(StaticResourceRequestUtil.getContentType(filePO.getFileType())); response.setContentType(StaticResourceRequestUtil.getContentType(filePO.getFileType()));
if (!isOpen) { if (!isOpen) {
// 下载 // 下载
@ -388,6 +405,57 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau
return isDownloadComplete; return isDownloadComplete;
} }
@Override
public String getUploadPath(String baseUploadPath, UploadTypeEnum uploadTypeEnum, String fileType) throws FileException {
StringBuilder filePath = new StringBuilder();
if (!baseUploadPath.endsWith(File.separator)) {
filePath.append(baseUploadPath).append(File.separator);
} else {
filePath.append(baseUploadPath);
}
boolean hasFileType = !StringUtils.isBlank(fileType);
if (uploadTypeEnum.getValue() == UploadTypeEnum.IMAGE.getValue()) {
if (hasFileType && !isTypeCorrect(getImageTypes(), fileType)) {
throw new FileException("图片格式不支持上传");
}
filePath.append("images");
} else if (uploadTypeEnum.getValue() == UploadTypeEnum.VIDEO.getValue()) {
if (hasFileType && !isTypeCorrect(getVideoTypes(), fileType)) {
throw new FileException("视频格式不支持上传");
}
filePath.append("videos");
} else if (uploadTypeEnum.getValue() == UploadTypeEnum.AUDIO.getValue()) {
if (hasFileType && !isTypeCorrect(getAudioTypes(), fileType)) {
throw new FileException("音频格式不支持上传");
}
filePath.append("audios");
} else if (uploadTypeEnum.getValue() == UploadTypeEnum.ERROR_EXCEL.getValue()) {
filePath.append("errorexcels");
} else {
if (hasFileType && !isTypeCorrect(getFileTypes(), fileType)) {
throw new FileException("文件格式不支持上传");
}
filePath.append("files");
}
filePath.append(File.separator).append(DateUtil.getDays());
return filePath.toString();
}
/**
* 获取上传文件名称
*
* @param fileType
* @return
*/
private String getUploadFileName(String fileType) {
String uploadFileName = UUIDUtil.get32UUID();
if (!StringUtils.isEmpty(fileType)) {
uploadFileName += "." + fileType;
}
return uploadFileName;
}
@Override @Override
public SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page) { public SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page) {
PageHelper.startPage(page.getPage(), page.getRows()); PageHelper.startPage(page.getPage(), page.getRows());
@ -540,56 +608,6 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau
return false; return false;
} }
@Override
public String getUploadPath(String baseUploadPath, UploadTypeEnum uploadTypeEnum, String fileType) throws FileException {
StringBuilder filePath = new StringBuilder();
if (!baseUploadPath.endsWith(File.separator)) {
filePath.append(baseUploadPath).append(File.separator);
} else {
filePath.append(baseUploadPath);
}
boolean hasFileType = !StringUtils.isBlank(fileType);
if (uploadTypeEnum.getValue() == UploadTypeEnum.IMAGE.getValue()) {
if (hasFileType && !isTypeCorrect(getImageTypes(), fileType)) {
throw new FileException("图片格式不支持上传");
}
filePath.append("images");
} else if (uploadTypeEnum.getValue() == UploadTypeEnum.VIDEO.getValue()) {
if (hasFileType && !isTypeCorrect(getVideoTypes(), fileType)) {
throw new FileException("视频格式不支持上传");
}
filePath.append("videos");
} else if (uploadTypeEnum.getValue() == UploadTypeEnum.AUDIO.getValue()) {
if (hasFileType && !isTypeCorrect(getAudioTypes(), fileType)) {
throw new FileException("音频格式不支持上传");
}
filePath.append("audios");
} else if (uploadTypeEnum.getValue() == UploadTypeEnum.ERROR_EXCEL.getValue()) {
filePath.append("errorexcels");
} else {
if (hasFileType && !isTypeCorrect(getFileTypes(), fileType)) {
throw new FileException("文件格式不支持上传");
}
filePath.append("files");
}
filePath.append(File.separator).append(DateUtil.getDays());
return filePath.toString();
}
/**
* 获取上传文件名称
*
* @param fileType
* @return
*/
private String getUploadFileName(String fileType) {
String uploadFileName = UUIDUtil.get32UUID();
if (!StringUtils.isEmpty(fileType)) {
uploadFileName += "." + fileType;
}
return uploadFileName;
}
/** /**
* 保存文件到本地 * 保存文件到本地
* *

View File

@ -51,15 +51,6 @@ public class FileServiceImpl extends DefaultBaseService implements IFileService
@Autowired @Autowired
private IMinIoFileService minIoFileService; private IMinIoFileService minIoFileService;
@Override
public SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page) {
if (fileProperties.getUseMinIo()) {
return minIoFileService.listPageInfo(page);
} else {
return defaultFileService.listPageInfo(page);
}
}
@Override @Override
public void remove(String ids) { public void remove(String ids) {
remove(Arrays.asList(ids.split("_"))); remove(Arrays.asList(ids.split("_")));
@ -161,33 +152,6 @@ public class FileServiceImpl extends DefaultBaseService implements IFileService
defaultFileService.saveUploadFileInfo(null, fileName, uploadPath, fileName, "xls", fileSize, params); defaultFileService.saveUploadFileInfo(null, fileName, uploadPath, fileName, "xls", fileSize, params);
} }
@Override
public String getUploadExcelErrorPath() {
String baseUploadPath = fileProperties.getUploadPath();
if (StringUtils.isBlank(baseUploadPath)) {
throw new SystemException("上传路径未配置");
}
return defaultFileService.getUploadPath(baseUploadPath, UploadTypeEnum.ERROR_EXCEL, null);
}
@Override
public List<FileDTO> list(List<String> idList) throws SearchException {
if (fileProperties.getUseMinIo()) {
return minIoFileService.list(idList);
} else {
return defaultFileService.list(idList);
}
}
@Override
public List<FilePO> listPO(List<String> idList) {
if (fileProperties.getUseMinIo()) {
return minIoFileService.listPO(idList);
} else {
return defaultFileService.listPO(idList);
}
}
@Override @Override
public String saveFileByUserId(String userId, FileVO fileVO) { public String saveFileByUserId(String userId, FileVO fileVO) {
if (fileProperties.getUseMinIo()) { if (fileProperties.getUseMinIo()) {
@ -265,6 +229,42 @@ public class FileServiceImpl extends DefaultBaseService implements IFileService
} }
} }
@Override
public String getUploadExcelErrorPath() {
String baseUploadPath = fileProperties.getUploadPath();
if (StringUtils.isBlank(baseUploadPath)) {
throw new SystemException("上传路径未配置");
}
return defaultFileService.getUploadPath(baseUploadPath, UploadTypeEnum.ERROR_EXCEL, null);
}
@Override
public List<FileDTO> list(List<String> idList) throws SearchException {
if (fileProperties.getUseMinIo()) {
return minIoFileService.list(idList);
} else {
return defaultFileService.list(idList);
}
}
@Override
public List<FilePO> listPO(List<String> idList) {
if (fileProperties.getUseMinIo()) {
return minIoFileService.listPO(idList);
} else {
return defaultFileService.listPO(idList);
}
}
@Override
public SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page) {
if (fileProperties.getUseMinIo()) {
return minIoFileService.listPageInfo(page);
} else {
return defaultFileService.listPageInfo(page);
}
}
/** /**
* uEditor文件列表 * uEditor文件列表
* *

View File

@ -3,7 +3,7 @@ package ink.wgink.module.file.service.impl;
import ink.wgink.common.base.DefaultBaseService; import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.FileException; import ink.wgink.exceptions.FileException;
import ink.wgink.exceptions.base.SystemException; import ink.wgink.exceptions.base.SystemException;
import ink.wgink.module.file.dao.IFileDao; import ink.wgink.interfaces.file.IMongoFileService;
import ink.wgink.module.file.enums.UploadTypeEnum; import ink.wgink.module.file.enums.UploadTypeEnum;
import ink.wgink.module.file.pojo.dtos.FileDTO; import ink.wgink.module.file.pojo.dtos.FileDTO;
import ink.wgink.module.file.pojo.dtos.FileInfoDTO; import ink.wgink.module.file.pojo.dtos.FileInfoDTO;
@ -18,18 +18,15 @@ import ink.wgink.properties.FileMinIoProperties;
import ink.wgink.properties.FileProperties; import ink.wgink.properties.FileProperties;
import ink.wgink.util.ArrayListUtil; import ink.wgink.util.ArrayListUtil;
import ink.wgink.util.UUIDUtil; import ink.wgink.util.UUIDUtil;
import ink.wgink.util.map.HashMapUtil; import ink.wgink.util.date.DateUtil;
import ink.wgink.util.request.StaticResourceRequestUtil; import ink.wgink.util.request.StaticResourceRequestUtil;
import io.minio.*; import io.minio.*;
import io.minio.errors.*; import io.minio.errors.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.DateTimeZone; import org.joda.time.DateTimeZone;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -45,7 +42,6 @@ import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.regex.Pattern;
/** /**
* @ClassName: MinIOServiceImpl * @ClassName: MinIOServiceImpl
@ -57,15 +53,12 @@ import java.util.regex.Pattern;
@Service @Service
public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFileService { public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFileService {
public static final String UPLOAD_FILE_COLLECTION_NAME = "uploadFiles";
@Autowired @Autowired
private FileProperties fileProperties; private FileProperties fileProperties;
@Autowired @Autowired
private IFileDao fileDao;
@Autowired
private IDefaultFileService defaultFileService; private IDefaultFileService defaultFileService;
@Autowired(required = false) @Autowired(required = false)
private MongoTemplate mongoTemplate; private IMongoFileService mongoFileService;
private FileMinIoProperties minIoProperties; private FileMinIoProperties minIoProperties;
private MinioClient minioClient; private MinioClient minioClient;
@ -84,12 +77,8 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
@Override @Override
public String saveFileByUserId(String userId, FileVO fileVO) { public String saveFileByUserId(String userId, FileVO fileVO) {
String fileId = defaultFileService.saveFileByUserId(userId, fileVO); String fileId = defaultFileService.saveFileByUserId(userId, fileVO);
if (mongoTemplate != null) { if (mongoFileService != null) {
Map<String, Object> params = HashMapUtil.beanToMap(fileVO); mongoFileService.saveByUserId(userId, fileVO);
params.put("fileId", fileId);
params.put("isBack", 0);
setSaveInfoByUserId(params, userId);
mongoTemplate.insert(params);
} }
return fileId; return fileId;
} }
@ -100,9 +89,8 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
return; return;
} }
defaultFileService.remove(ids); defaultFileService.remove(ids);
// 删除缓存 if (mongoFileService != null) {
if (mongoTemplate != null) { mongoFileService.delete(ids);
mongoTemplate.remove(Query.query(Criteria.where("fileId").in(ids)), UPLOAD_FILE_COLLECTION_NAME);
} }
} }
@ -114,8 +102,8 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
} }
List<String> fileIds = ArrayListUtil.listBeanStringIdValue(filePOs, "fileId", FilePO.class); List<String> fileIds = ArrayListUtil.listBeanStringIdValue(filePOs, "fileId", FilePO.class);
defaultFileService.delete(fileIds); defaultFileService.delete(fileIds);
if (mongoTemplate != null) { if (mongoFileService != null) {
mongoTemplate.remove(Query.query(Criteria.where("fileId").in(fileIds))); mongoFileService.delete(fileIds);
} }
} }
@ -131,12 +119,13 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
@Override @Override
public boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, Map<String, Object> params, boolean canRange) { public boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, Map<String, Object> params, boolean canRange) {
String fileId = params.get("fileId").toString();
FilePO filePO = null; FilePO filePO = null;
if (mongoTemplate != null) { if (mongoFileService != null) {
filePO = mongoTemplate.findOne(Query.query(Criteria.where("fileId").is(params.get("fileId").toString())), FilePO.class, UPLOAD_FILE_COLLECTION_NAME); filePO = mongoFileService.getPO(fileId);
} }
if (filePO == null) { if (filePO == null) {
filePO = fileDao.getPO(params); filePO = defaultFileService.getPO(fileId);
} }
if (filePO == null) { if (filePO == null) {
throw new FileException("文件不存在"); throw new FileException("文件不存在");
@ -181,7 +170,7 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
String objectName = filePO.getFileId() + "." + filePO.getFileType(); String objectName = filePO.getFileId() + "." + filePO.getFileType();
InputStream inputStream = null; InputStream inputStream = null;
try (OutputStream outputStream = response.getOutputStream();) { try (OutputStream outputStream = response.getOutputStream();) {
response.setHeader("Content-Length", filePO.getFileSize()); response.setHeader("Content-Length", filePO.getFileSize().toString());
response.setContentType(StaticResourceRequestUtil.getContentType(filePO.getFileType())); response.setContentType(StaticResourceRequestUtil.getContentType(filePO.getFileType()));
if (!isOpen) { if (!isOpen) {
// 下载 // 下载
@ -251,44 +240,36 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
@Override @Override
public SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page) { public SuccessResultList<List<FileInfoDTO>> listPageInfo(ListPage page) {
SuccessResultList<List<FileInfoDTO>> successResultList = null; SuccessResultList<List<FilePO>> filePOSuccessResultList = null;
if (mongoTemplate != null) { if (mongoFileService != null) {
Query query = new Query(); filePOSuccessResultList = mongoFileService.listPage(page);
String keywords = getKeywords(page.getParams());
if (!StringUtils.isBlank(keywords)) {
Pattern pattern = Pattern.compile("^.*" + keywords + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("fileName").regex(pattern));
} }
long total = mongoTemplate.count(query, UPLOAD_FILE_COLLECTION_NAME); if (filePOSuccessResultList != null && !filePOSuccessResultList.getRows().isEmpty()) {
query.with(Pageable.ofSize(page.getRows()).withPage(page.getPage() - 1)); List<FileInfoDTO> mongoFileInfos = filePO2FileInfo(filePOSuccessResultList.getRows());
List<FileInfoDTO> dataDTOs = mongoTemplate.find(query, FileInfoDTO.class, UPLOAD_FILE_COLLECTION_NAME); return new SuccessResultList<>(mongoFileInfos, filePOSuccessResultList.getPage(), filePOSuccessResultList.getTotal());
successResultList = new SuccessResultList<>(dataDTOs, page.getPage(), total);
}
if (successResultList != null && !successResultList.getRows().isEmpty()) {
return successResultList;
} }
return defaultFileService.listPageInfo(page); return defaultFileService.listPageInfo(page);
} }
@Override @Override
public List<FileDTO> list(List<String> idList) { public List<FileDTO> list(List<String> idList) {
List<FileDTO> fileDTOs = new ArrayList<>(); List<FilePO> filePOs = null;
if (mongoTemplate != null) { if (mongoFileService != null) {
return mongoTemplate.find(Query.query(Criteria.where("fileId").in(idList)), FileDTO.class, UPLOAD_FILE_COLLECTION_NAME); filePOs = mongoFileService.listByIds(idList);
} }
if (!fileDTOs.isEmpty()) { if (filePOs != null && !filePOs.isEmpty()) {
return fileDTOs; return filePO2FileDTO(filePOs);
} }
return defaultFileService.list(idList); return defaultFileService.list(idList);
} }
@Override @Override
public List<FilePO> listPO(List<String> idList) { public List<FilePO> listPO(List<String> idList) {
List<FilePO> filePOs = new ArrayList<>(); List<FilePO> filePOs = null;
if (mongoTemplate != null) { if (mongoFileService != null) {
filePOs = mongoTemplate.find(Query.query(Criteria.where("fileId").in(idList)), FilePO.class, UPLOAD_FILE_COLLECTION_NAME); filePOs = mongoFileService.listByIds(idList);
} }
if (!filePOs.isEmpty()) { if (filePOs != null && !filePOs.isEmpty()) {
return filePOs; return filePOs;
} }
return defaultFileService.listPO(idList); return defaultFileService.listPO(idList);
@ -297,8 +278,8 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
@Override @Override
public FilePO getPO(String fileId) { public FilePO getPO(String fileId) {
FilePO filePO = null; FilePO filePO = null;
if (mongoTemplate != null) { if (mongoFileService != null) {
filePO = mongoTemplate.findOne(Query.query(Criteria.where("fileId").is(fileId)), FilePO.class, UPLOAD_FILE_COLLECTION_NAME); filePO = mongoFileService.getPO(fileId);
} }
if (filePO != null) { if (filePO != null) {
return filePO; return filePO;
@ -308,17 +289,48 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
@Override @Override
public List<FileDTO> listByUrl(String fileUrl) { public List<FileDTO> listByUrl(String fileUrl) {
List<FileDTO> fileDTOs = new ArrayList<>(); List<FilePO> filePOs = null;
if (mongoTemplate != null) { if (mongoFileService != null) {
Pattern pattern = Pattern.compile("^.*" + fileUrl + ".*$", Pattern.CASE_INSENSITIVE); filePOs = mongoFileService.listByUrl(fileUrl);
fileDTOs = mongoTemplate.find(Query.query(Criteria.where("fileUrl").regex(pattern)), FileDTO.class, UPLOAD_FILE_COLLECTION_NAME);
} }
if (!fileDTOs.isEmpty()) { if (filePOs != null && !filePOs.isEmpty()) {
return fileDTOs; return filePO2FileDTO(filePOs);
} }
return defaultFileService.listByUrl(fileUrl); return defaultFileService.listByUrl(fileUrl);
} }
/**
* mongoFile转fileInfo
*
* @param filePOs
* @return
*/
private List<FileInfoDTO> filePO2FileInfo(List<FilePO> filePOs) {
List<FileInfoDTO> fileInfoDTOs = new ArrayList<>();
filePOs.forEach(mongoFile -> {
FileInfoDTO fileInfoDTO = new FileInfoDTO();
BeanUtils.copyProperties(mongoFile, fileInfoDTO);
fileInfoDTOs.add(fileInfoDTO);
});
return fileInfoDTOs;
}
/**
* mongoFile转fileDTO
*
* @param filePOs
* @return
*/
private List<FileDTO> filePO2FileDTO(List<FilePO> filePOs) {
List<FileDTO> fileDTOs = new ArrayList<>();
filePOs.forEach(mongoFile -> {
FileDTO fileDTO = new FileDTO();
BeanUtils.copyProperties(mongoFile, fileDTO);
fileDTOs.add(fileDTO);
});
return fileDTOs;
}
/** /**
* 上传文件到minIo * 上传文件到minIo
@ -334,7 +346,7 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
} }
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(uploadFileName).stream(inputStream, fileSize, -1).contentType(uploadFile.getContentType()).build()); minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(uploadFileName).stream(inputStream, fileSize, -1).contentType(StaticResourceRequestUtil.getContentType(uploadFileName)).build());
} catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) { } catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) {
throw new SystemException(e); throw new SystemException(e);
} }
@ -351,16 +363,14 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
* @param bucketName 桶名称 * @param bucketName 桶名称
*/ */
private void saveFile(String token, String fileId, String fileName, String fileType, long fileSize, String bucketName) { private void saveFile(String token, String fileId, String fileName, String fileType, long fileSize, String bucketName) {
Map<String, Object> params = getFileParams(fileId, fileName, fileType, fileSize, bucketName); String userId;
if(StringUtils.isBlank(token)) { if(StringUtils.isBlank(token)) {
setSaveInfo(params); userId = securityComponent.getCurrentUser().getUserId();
} else { } else {
setAppSaveInfo(token, params); userId = getAppTokenUser(token).getId();
}
fileDao.save(params);
if (mongoTemplate != null) {
mongoTemplate.insert(params, UPLOAD_FILE_COLLECTION_NAME);
} }
saveFileByUserId(userId, fileId, fileName, fileType, fileSize, bucketName);
} }
/** /**
@ -374,25 +384,37 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi
* @param bucketName * @param bucketName
*/ */
private void saveFileByUserId(String userId, String fileId, String fileName, String fileType, long fileSize, String bucketName) { private void saveFileByUserId(String userId, String fileId, String fileName, String fileType, long fileSize, String bucketName) {
Map<String, Object> params = getFileParams(fileId, fileName, fileType, fileSize, bucketName); FileVO fileVO = getFileVO(fileId, fileName, fileType, fileSize, bucketName);
setSaveInfoByUserId(params, userId); defaultFileService.saveFile(fileVO);
fileDao.save(params); if (mongoFileService != null) {
if (mongoTemplate != null) { mongoFileService.saveByUserId(userId, fileVO);
mongoTemplate.insert(params, UPLOAD_FILE_COLLECTION_NAME);
} }
} }
private Map<String, Object> getFileParams(String fileId, String fileName, String fileType, long fileSize, String bucketName) { /**
Map<String, Object> params = getHashMap(2); * 获取文件VO
params.put("fileId", fileId); *
params.put("fileName", fileName); * @param fileId
params.put("filePath", null); * @param fileName
params.put("fileUrl", bucketName); * @param fileType
params.put("fileType", fileType); * @param fileSize
params.put("fileSize", fileSize); * @param bucketName
params.put("fileSummary", "minio"); * @return
params.put("isBack", 1); */
return params; private FileVO getFileVO(String fileId, String fileName, String fileType, long fileSize, String bucketName) {
String dateTime = DateUtil.getTime();
FileVO fileVO = new FileVO();
fileVO.setFileId(fileId);
fileVO.setFileName(fileName);
fileVO.setFilePath(null);
fileVO.setFileUrl(bucketName);
fileVO.setFileType(fileType);
fileVO.setFileSize(fileSize);
fileVO.setFileSummary("minio");
fileVO.setIsBack(1);
fileVO.setGmtCreate(dateTime);
fileVO.setGmtModified(dateTime);
return fileVO;
} }
/** /**

28
mongo-module-file/pom.xml Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>wg-basic</artifactId>
<groupId>ink.wgink</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mongo-module-file</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ink.wgink</groupId>
<artifactId>module-file</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,75 @@
package ink.wgink.mongo.module.file.service;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.file.IMongoFileService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.pos.FilePO;
import ink.wgink.pojo.result.SuccessResultList;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.regex.Pattern;
/**
* @ClassName: MongoFileService
* @Description:
* @Author: wanggeng
* @Date: 2021/12/12 6:18 PM
* @Version: 1.0
*/
@Service
public class MongoFileService extends DefaultBaseService implements IMongoFileService {
@Autowired(required = false)
private MongoTemplate mongoTemplate;
@Override
public void saveByUserId(String userId, FilePO filePO) {
filePO.setCreator(userId);
filePO.setModifier(userId);
mongoTemplate.insert(filePO, UPLOAD_FILE_COLLECTION_NAME);
}
@Override
public void delete(List<String> fileIds) {
mongoTemplate.remove(Query.query(Criteria.where("fileId").in(fileIds)), UPLOAD_FILE_COLLECTION_NAME);
}
@Override
public FilePO getPO(String fileId) {
return mongoTemplate.findOne(Query.query(Criteria.where("fileId").is(fileId)), FilePO.class, UPLOAD_FILE_COLLECTION_NAME);
}
@Override
public SuccessResultList<List<FilePO>> listPage(ListPage page) {
Query query = new Query();
String keywords = getKeywords(page.getParams());
if (!StringUtils.isBlank(keywords)) {
Pattern pattern = Pattern.compile("^.*" + keywords + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("fileName").regex(pattern));
}
long total = mongoTemplate.count(query, UPLOAD_FILE_COLLECTION_NAME);
query.with(Pageable.ofSize(page.getRows()).withPage(page.getPage() - 1));
List<FilePO> dataDTOs = mongoTemplate.find(query, FilePO.class, UPLOAD_FILE_COLLECTION_NAME);
return new SuccessResultList<>(dataDTOs, page.getPage(), total);
}
@Override
public List<FilePO> listByIds(List<String> fileIds) {
return mongoTemplate.find(Query.query(Criteria.where("fileId").in(fileIds)), FilePO.class, UPLOAD_FILE_COLLECTION_NAME);
}
@Override
public List<FilePO> listByUrl(String fileUrl) {
Pattern pattern = Pattern.compile("^.*" + fileUrl + ".*$", Pattern.CASE_INSENSITIVE);
return mongoTemplate.find(Query.query(Criteria.where("fileUrl").regex(pattern)), FilePO.class, UPLOAD_FILE_COLLECTION_NAME);
}
}

View File

@ -42,6 +42,7 @@
<module>module-oauth2-client</module> <module>module-oauth2-client</module>
<module>mongo-module-dictionary</module> <module>mongo-module-dictionary</module>
<module>redis-cache</module> <module>redis-cache</module>
<module>mongo-module-file</module>
</modules> </modules>
<packaging>pom</packaging> <packaging>pom</packaging>