From 91e8ca193d2b9520fb3108bdb28bf7e2f3c97ba9 Mon Sep 17 00:00:00 2001 From: wanggeng <450292408@qq.com> Date: Mon, 25 Jul 2022 23:29:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E5=AE=8C=E5=96=84=E4=BA=86=E6=96=87=E4=BB=B6?= =?UTF-8?q?v2=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/file/components/FileComponent.java | 246 ++++++++++++++++++ .../FileController.java} | 30 +-- .../FileAppController.java} | 38 +-- .../ink/wgink/module/file/dao/IFileDao.java | 11 + .../dtos/{ => v2}/FileUploadSuccessDTO.java | 11 +- .../module/file/pojo/vos/v2/FileSaveVO.java | 57 ++++ .../module/file/pojo/vos/v2/FileUpdateVO.java | 20 ++ .../service/impl/DefaultFileServiceImpl.java | 7 +- .../service/impl/MinIoFileServiceImpl.java | 5 +- .../module/file/service/v2/IFileService.java | 115 ++++++++ .../file/service/v2/IFileV2Service.java | 66 ----- .../file/service/v2/impl/FileServiceImpl.java | 171 ++++++++++++ .../service/v2/impl/FileV2ServiceImpl.java | 73 ------ .../resources/mybatis/mapper/file-mapper.xml | 52 +++- 14 files changed, 705 insertions(+), 197 deletions(-) create mode 100644 module-file/src/main/java/ink/wgink/module/file/components/FileComponent.java rename module-file/src/main/java/ink/wgink/module/file/controller/api/{FileV2Controller.java => v2/FileController.java} (74%) rename module-file/src/main/java/ink/wgink/module/file/controller/app/api/{FileV2AppController.java => v2/FileAppController.java} (83%) rename module-file/src/main/java/ink/wgink/module/file/pojo/dtos/{ => v2}/FileUploadSuccessDTO.java (85%) create mode 100644 module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileSaveVO.java create mode 100644 module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileUpdateVO.java create mode 100644 module-file/src/main/java/ink/wgink/module/file/service/v2/IFileService.java delete mode 100644 module-file/src/main/java/ink/wgink/module/file/service/v2/IFileV2Service.java create mode 100644 module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileServiceImpl.java delete mode 100644 module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileV2ServiceImpl.java diff --git a/module-file/src/main/java/ink/wgink/module/file/components/FileComponent.java b/module-file/src/main/java/ink/wgink/module/file/components/FileComponent.java new file mode 100644 index 00000000..c67822c3 --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/components/FileComponent.java @@ -0,0 +1,246 @@ +package ink.wgink.module.file.components; + +import ink.wgink.exceptions.FileException; +import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.base.SystemException; +import ink.wgink.module.file.enums.UploadTypeEnum; +import ink.wgink.module.file.service.IFileService; +import ink.wgink.properties.FileProperties; +import ink.wgink.util.date.DateUtil; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * @ClassName: FileUtil + * @Description: 文件工具 + * @Author: wanggeng + * @Date: 2022/7/25 17:00 + * @Version: 1.0 + */ +@Component +public class FileComponent { + + protected static final Logger LOG = LoggerFactory.getLogger(FileComponent.class); + private static final char[] HEX_CODE = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + private String[] imageTypes; + private String[] videoTypes; + private String[] audioTypes; + private String[] fileTypes; + @Autowired + private FileProperties fileProperties; + + /** + * 保存文件 + * + * @param fileInputStream + * @param fileName + * @param filePath + * @return + */ + public long saveFile(InputStream fileInputStream, String fileName, String filePath) { + File uploadFolder = new File(filePath); + if (!uploadFolder.exists()) { + uploadFolder.mkdirs(); + } + FileOutputStream uploadFileOutputStream = null; + long fileSize = 0; + try { + uploadFileOutputStream = new FileOutputStream(uploadFolder + File.separator + fileName); + int readLength; + for (byte[] buf = new byte[IFileService.INPUT_STREAM_SIZE]; (readLength = fileInputStream.read(buf)) > -1; ) { + uploadFileOutputStream.write(buf, 0, readLength); + fileSize += readLength; + } + uploadFileOutputStream.flush(); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + throw new FileException("文件上传失败"); + } finally { + try { + if (null != uploadFileOutputStream) { + uploadFileOutputStream.close(); + } + if (null != fileInputStream) { + fileInputStream.close(); + } + } catch (Exception e1) { + LOG.error(e1.getMessage()); + throw new FileException("文件上传失败"); + } + } + return fileSize; + } + + /** + * 删除源文件 + * + * @param sourceFilePath + */ + public static void deleteSourceFile(String sourceFilePath) { + File file = new File(sourceFilePath); + if (file.exists()) { + boolean isDelete = file.delete(); + if (isDelete) { + LOG.debug("文件删除成功"); + } else { + LOG.debug("文件删除失败"); + } + } + } + + /** + * 获取文件的MD5 + * + * @param file + * @return + */ + public String getFileMD5(File file) { + if (file == null) { + throw new SearchException("文件不存在"); + } + if (!file.exists()) { + throw new SearchException("文件不存在"); + } + String fileMd5; + try (InputStream inputStream = Files.newInputStream(file.toPath())) { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + int readLength; + for (byte[] buf = new byte[IFileService.INPUT_STREAM_SIZE]; (readLength = inputStream.read(buf)) > -1; ) { + messageDigest.update(buf, 0, readLength); + } + // 计算文件的MD5 + byte[] data = messageDigest.digest(); + StringBuilder fileMd5SB = new StringBuilder(data.length * 2); + for (byte b : data) { + fileMd5SB.append(HEX_CODE[(b >> 4) & 0xF]); + fileMd5SB.append(HEX_CODE[(b & 0xF)]); + } + fileMd5 = fileMd5SB.toString(); + } catch (IOException | NoSuchAlgorithmException e) { + throw new SystemException(e); + } + return fileMd5; + } + + /** + * 获取上传绝对文件 + * + * @param uploadTypeEnum + * @param fileType + * @return + * @throws FileException + */ + public String getUploadPath(UploadTypeEnum uploadTypeEnum, String fileType) throws FileException { + String baseUploadPath = fileProperties.getUploadPath(); + if (StringUtils.isBlank(baseUploadPath)) { + throw new SystemException("上传路径未配置"); + } + 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(); + } + + /** + * 获取文件url + * + * @param uploadPath + * @return + */ + public String getFileUrl(String uploadPath) { + String fileUrl = uploadPath.replace(fileProperties.getUploadPath(), ""); + if ("\\".equals(File.separator)) { + fileUrl = fileUrl.replace("\\", "/"); + } + if (fileUrl.startsWith("/")) { + fileUrl = fileUrl.substring(1, fileUrl.length() - 1); + } + return fileUrl; + } + + /** + * 获取文件类型 + * + * @param fileName + * @return + */ + public String getFileType(String fileName) { + String[] names = fileName.split("\\."); + if (names != null) { + return names[names.length - 1].toLowerCase(); + } + return ""; + } + + /** + * 校验类型 + * + * @param types + * @param fileType + * @return + */ + public boolean isTypeCorrect(String[] types, String fileType) { + for (String type : types) { + if (StringUtils.equalsIgnoreCase(fileType, type)) { + return true; + } + } + return false; + } + + public String[] getImageTypes() { + return imageTypes == null ? fileProperties.getImageTypes().split(",") : imageTypes; + } + + public String[] getVideoTypes() { + return videoTypes == null ? fileProperties.getVideoTypes().split(",") : videoTypes; + } + + public String[] getAudioTypes() { + return audioTypes == null ? fileProperties.getAudioTypes().split(",") : audioTypes; + } + + public String[] getFileTypes() { + return fileTypes == null ? fileProperties.getFileTypes().split(",") : fileTypes; + } + +} diff --git a/module-file/src/main/java/ink/wgink/module/file/controller/api/FileV2Controller.java b/module-file/src/main/java/ink/wgink/module/file/controller/api/v2/FileController.java similarity index 74% rename from module-file/src/main/java/ink/wgink/module/file/controller/api/FileV2Controller.java rename to module-file/src/main/java/ink/wgink/module/file/controller/api/v2/FileController.java index f32dcf1c..622989c0 100644 --- a/module-file/src/main/java/ink/wgink/module/file/controller/api/FileV2Controller.java +++ b/module-file/src/main/java/ink/wgink/module/file/controller/api/v2/FileController.java @@ -1,10 +1,10 @@ -package ink.wgink.module.file.controller.api; +package ink.wgink.module.file.controller.api.v2; import ink.wgink.common.base.DefaultBaseController; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.module.file.enums.UploadTypeEnum; -import ink.wgink.module.file.pojo.dtos.FileUploadSuccessDTO; -import ink.wgink.module.file.service.v2.IFileV2Service; +import ink.wgink.module.file.pojo.dtos.v2.FileUploadSuccessDTO; +import ink.wgink.module.file.service.v2.IFileService; import ink.wgink.pojo.result.ErrorResult; import ink.wgink.pojo.result.SuccessResultData; import io.swagger.annotations.*; @@ -15,8 +15,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import java.util.Map; - /** * @ClassName: FileController * @Description: 文件处理 @@ -25,12 +23,12 @@ import java.util.Map; * @Version: 1.0 **/ @Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "文件接口") -@RestController +@RestController("fileControllerV2") @RequestMapping(ISystemConstant.API_PREFIX + "/file/v2") -public class FileV2Controller extends DefaultBaseController { +public class FileController extends DefaultBaseController { @Autowired - private IFileV2Service fileV2Service; + private IFileService fileService; @ApiOperation(value = "上传文件", notes = "上传文件接口") @ApiImplicitParams({ @@ -39,8 +37,7 @@ public class FileV2Controller extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-file") public SuccessResultData uploadFile(@RequestParam("file") MultipartFile file) { - Map params = requestParams(); - return uploadSingle(file, UploadTypeEnum.FILE, params); + return uploadSingle(file, UploadTypeEnum.FILE); } @ApiOperation(value = "上传图片", notes = "上传图片接口") @@ -50,8 +47,7 @@ public class FileV2Controller extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-image") public SuccessResultData uploadImage(@RequestParam("image") MultipartFile image) { - Map params = requestParams(); - return uploadSingle(image, UploadTypeEnum.IMAGE, params); + return uploadSingle(image, UploadTypeEnum.IMAGE); } @ApiOperation(value = "上传视频", notes = "上传视频接口") @@ -61,8 +57,7 @@ public class FileV2Controller extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-video") public SuccessResultData uploadVideo(@RequestParam("video") MultipartFile video) { - Map params = requestParams(); - return uploadSingle(video, UploadTypeEnum.VIDEO, params); + return uploadSingle(video, UploadTypeEnum.VIDEO); } @ApiOperation(value = "上传音频", notes = "上传音频接口") @@ -72,8 +67,7 @@ public class FileV2Controller extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-audio") public SuccessResultData uploadAudio(@RequestParam("audio") MultipartFile audio) { - Map params = requestParams(); - return uploadSingle(audio, UploadTypeEnum.AUDIO, params); + return uploadSingle(audio, UploadTypeEnum.AUDIO); } /** @@ -83,8 +77,8 @@ public class FileV2Controller extends DefaultBaseController { * @param params * @return */ - private SuccessResultData uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map params) { - return new SuccessResultData<>(fileV2Service.uploadSingle(uploadFile, uploadTypeEnum, params)); + private SuccessResultData uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum) { + return new SuccessResultData<>(fileService.uploadSingle(uploadFile, uploadTypeEnum)); } } diff --git a/module-file/src/main/java/ink/wgink/module/file/controller/app/api/FileV2AppController.java b/module-file/src/main/java/ink/wgink/module/file/controller/app/api/v2/FileAppController.java similarity index 83% rename from module-file/src/main/java/ink/wgink/module/file/controller/app/api/FileV2AppController.java rename to module-file/src/main/java/ink/wgink/module/file/controller/app/api/v2/FileAppController.java index 5afce069..78a975c8 100644 --- a/module-file/src/main/java/ink/wgink/module/file/controller/app/api/FileV2AppController.java +++ b/module-file/src/main/java/ink/wgink/module/file/controller/app/api/v2/FileAppController.java @@ -1,10 +1,10 @@ -package ink.wgink.module.file.controller.app.api; +package ink.wgink.module.file.controller.app.api.v2; import ink.wgink.common.base.DefaultBaseController; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.module.file.enums.UploadTypeEnum; -import ink.wgink.module.file.pojo.dtos.FileUploadSuccessDTO; -import ink.wgink.module.file.service.v2.IFileV2Service; +import ink.wgink.module.file.pojo.dtos.v2.FileUploadSuccessDTO; +import ink.wgink.module.file.service.v2.IFileService; import ink.wgink.pojo.result.ErrorResult; import ink.wgink.pojo.result.SuccessResultData; import io.swagger.annotations.*; @@ -12,8 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.util.Map; - /** * When you feel like quitting. Think about why you started * 当你想要放弃的时候,想想当初你为何开始 @@ -25,12 +23,12 @@ import java.util.Map; * @Version: 1.0 **/ @Api(tags = ISystemConstant.API_TAGS_APP_PREFIX + "文件管理接口") -@RestController +@RestController("fileAppControllerV2") @RequestMapping(ISystemConstant.APP_PREFIX + "/file/v2") -public class FileV2AppController extends DefaultBaseController { +public class FileAppController extends DefaultBaseController { @Autowired - private IFileV2Service fileV2Service; + private IFileService fileV2Service; @ApiOperation(value = "上传文件", notes = "上传文件接口") @ApiImplicitParams({ @@ -40,8 +38,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-file") public SuccessResultData uploadFile(@RequestHeader("token") String token, @RequestParam("file") MultipartFile file) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, file, UploadTypeEnum.FILE, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, file, UploadTypeEnum.FILE)); } @ApiOperation(value = "上传文件", notes = "上传文件接口") @@ -52,8 +49,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-file-release") public SuccessResultData uploadFileByUserId(@RequestHeader("userId") String userId, @RequestParam("file") MultipartFile file) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, file, UploadTypeEnum.FILE, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, file, UploadTypeEnum.FILE)); } @ApiOperation(value = "上传图片", notes = "上传图片接口") @@ -64,8 +60,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-image") public SuccessResultData uploadImage(@RequestHeader("token") String token, @RequestParam("image") MultipartFile image) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, image, UploadTypeEnum.IMAGE, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, image, UploadTypeEnum.IMAGE)); } @ApiOperation(value = "上传图片", notes = "上传图片接口") @@ -76,8 +71,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-image-release") public SuccessResultData uploadImageByUserId(@RequestHeader("userId") String userId, @RequestParam("image") MultipartFile image) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, image, UploadTypeEnum.IMAGE, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, image, UploadTypeEnum.IMAGE)); } @ApiOperation(value = "上传视频", notes = "上传视频接口") @@ -88,8 +82,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-video") public SuccessResultData uploadVideo(@RequestHeader("token") String token, @RequestParam("video") MultipartFile video) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, video, UploadTypeEnum.VIDEO, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, video, UploadTypeEnum.VIDEO)); } @ApiOperation(value = "上传视频", notes = "上传视频接口") @@ -100,8 +93,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-video-release") public SuccessResultData uploadVideoByUserId(@RequestHeader("userId") String userId, @RequestParam("video") MultipartFile video) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, video, UploadTypeEnum.VIDEO, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, video, UploadTypeEnum.VIDEO)); } @ApiOperation(value = "上传音频", notes = "上传音频接口") @@ -112,8 +104,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-audio") public SuccessResultData uploadAudio(@RequestHeader("token") String token, @RequestParam("audio") MultipartFile audio) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, audio, UploadTypeEnum.AUDIO, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByToken(token, audio, UploadTypeEnum.AUDIO)); } @ApiOperation(value = "上传音频", notes = "上传音频接口") @@ -124,8 +115,7 @@ public class FileV2AppController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("upload-audio-release") public SuccessResultData uploadAudioByUserId(@RequestHeader("userId") String userId, @RequestParam("audio") MultipartFile audio) { - Map params = requestParams(); - return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, audio, UploadTypeEnum.AUDIO, params)); + return new SuccessResultData<>(fileV2Service.uploadSingleByUserId(userId, audio, UploadTypeEnum.AUDIO)); } } diff --git a/module-file/src/main/java/ink/wgink/module/file/dao/IFileDao.java b/module-file/src/main/java/ink/wgink/module/file/dao/IFileDao.java index d4676bde..99df36c7 100644 --- a/module-file/src/main/java/ink/wgink/module/file/dao/IFileDao.java +++ b/module-file/src/main/java/ink/wgink/module/file/dao/IFileDao.java @@ -4,6 +4,7 @@ package ink.wgink.module.file.dao; import ink.wgink.exceptions.RemoveException; import ink.wgink.exceptions.SaveException; import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.UpdateException; import ink.wgink.interfaces.init.IInitBaseTable; import ink.wgink.module.file.pojo.dtos.FileDTO; import ink.wgink.module.file.pojo.dtos.FileInfoDTO; @@ -31,6 +32,7 @@ public interface IFileDao extends IInitBaseTable { */ void save(Map params) throws SaveException; + /** * 删除文件 * @@ -47,6 +49,14 @@ public interface IFileDao extends IInitBaseTable { */ void delete(Map params) throws RemoveException; + /** + * 修改文件 + * + * @param params + * @throws UpdateException + */ + void update(Map params) throws UpdateException; + /** * 更新文件描述 * @@ -99,4 +109,5 @@ public interface IFileDao extends IInitBaseTable { * @throws SearchException */ List listPO(Map params) throws SearchException; + } diff --git a/module-file/src/main/java/ink/wgink/module/file/pojo/dtos/FileUploadSuccessDTO.java b/module-file/src/main/java/ink/wgink/module/file/pojo/dtos/v2/FileUploadSuccessDTO.java similarity index 85% rename from module-file/src/main/java/ink/wgink/module/file/pojo/dtos/FileUploadSuccessDTO.java rename to module-file/src/main/java/ink/wgink/module/file/pojo/dtos/v2/FileUploadSuccessDTO.java index 55fac07e..074e5609 100644 --- a/module-file/src/main/java/ink/wgink/module/file/pojo/dtos/FileUploadSuccessDTO.java +++ b/module-file/src/main/java/ink/wgink/module/file/pojo/dtos/v2/FileUploadSuccessDTO.java @@ -1,4 +1,4 @@ -package ink.wgink.module.file.pojo.dtos; +package ink.wgink.module.file.pojo.dtos.v2; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -24,6 +24,15 @@ public class FileUploadSuccessDTO implements Serializable { @ApiModelProperty(name = "fileSize", value = "文件大小") private Long fileSize; + public FileUploadSuccessDTO() { + } + + public FileUploadSuccessDTO(String fileId, String fileName, Long fileSize) { + this.fileId = fileId; + this.fileName = fileName; + this.fileSize = fileSize; + } + public String getFileId() { return fileId == null ? "" : fileId.trim(); } diff --git a/module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileSaveVO.java b/module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileSaveVO.java new file mode 100644 index 00000000..04bc0296 --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileSaveVO.java @@ -0,0 +1,57 @@ +package ink.wgink.module.file.pojo.vos.v2; + +/** + * @ClassName: FileSaveVO + * @Description: 文件保存 + * @Author: wanggeng + * @Date: 2022/7/25 17:58 + * @Version: 1.0 + */ +public class FileSaveVO { + + private String fileName; + private String fileType; + private String uploadPath; + private long fileSize; + private String creator; + + public String getFileName() { + return fileName == null ? "" : fileName.trim(); + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType == null ? "" : fileType.trim(); + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getUploadPath() { + return uploadPath == null ? "" : uploadPath.trim(); + } + + public void setUploadPath(String uploadPath) { + this.uploadPath = uploadPath; + } + + public long getFileSize() { + return fileSize; + } + + public void setFileSize(long fileSize) { + this.fileSize = fileSize; + } + + public String getCreator() { + return creator == null ? "" : creator.trim(); + } + + public void setCreator(String creator) { + this.creator = creator; + } +} diff --git a/module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileUpdateVO.java b/module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileUpdateVO.java new file mode 100644 index 00000000..243684ef --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/pojo/vos/v2/FileUpdateVO.java @@ -0,0 +1,20 @@ +package ink.wgink.module.file.pojo.vos.v2; + +/** + * @ClassName: FileUpdateVO + * @Description: 文件修改 + * @Author: wanggeng + * @Date: 2022/7/25 22:06 + * @Version: 1.0 + */ +public class FileUpdateVO extends FileSaveVO { + private String fileId; + + public String getFileId() { + return fileId == null ? "" : fileId.trim(); + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } +} diff --git a/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java b/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java index ffa5de8a..5afc2e2b 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java @@ -628,9 +628,10 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau uploadFileInputStream = uploadFile.getInputStream(); uploadFileOutputStream = new FileOutputStream(new File(uploadFolder + "/" + uploadFileName)); MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - for (byte[] buf = new byte[IFileService.INPUT_STREAM_SIZE]; uploadFileInputStream.read(buf) > -1; ) { - uploadFileOutputStream.write(buf, 0, buf.length); - messageDigest.update(buf, 0, buf.length); + int readLength; + for (byte[] buf = new byte[IFileService.INPUT_STREAM_SIZE]; (readLength = uploadFileInputStream.read(buf)) > -1; ) { + uploadFileOutputStream.write(buf, 0, readLength); + messageDigest.update(buf, 0, readLength); } uploadFileOutputStream.flush(); // 计算文件的MD5 diff --git a/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java b/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java index d65f6848..3af99cce 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java @@ -233,8 +233,9 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi } outputStream.flush(); inputStream.close(); - } catch (ServerException | IOException | ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | NoSuchAlgorithmException | - XmlParserException e) { + } catch (ServerException | IOException | ErrorResponseException | InsufficientDataException | + InternalException | InvalidKeyException | InvalidResponseException | NoSuchAlgorithmException | + XmlParserException e) { throw new FileException("文件输出异常", e); } finally { if (inputStream != null) { diff --git a/module-file/src/main/java/ink/wgink/module/file/service/v2/IFileService.java b/module-file/src/main/java/ink/wgink/module/file/service/v2/IFileService.java new file mode 100644 index 00000000..309f788c --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/service/v2/IFileService.java @@ -0,0 +1,115 @@ +package ink.wgink.module.file.service.v2; + +import ink.wgink.module.file.enums.UploadTypeEnum; +import ink.wgink.module.file.pojo.dtos.v2.FileUploadSuccessDTO; +import ink.wgink.module.file.pojo.vos.v2.FileSaveVO; +import ink.wgink.module.file.pojo.vos.v2.FileUpdateVO; +import ink.wgink.pojo.pos.FilePO; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.util.Map; + +/** + * @ClassName: IFileV2Service + * @Description: 文件V2 + * @Author: wanggeng + * @Date: 2022/4/13 16:15 + * @Version: 1.0 + */ +public interface IFileService { + + /** + * 单文件上传 + * + * @param uploadFile 上传文件 + * @param uploadTypeEnum 上传类型 + * @return + */ + FileUploadSuccessDTO uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum); + + /** + * 单文件上传 + * + * @param inputStream 文件流 + * @param uploadTypeEnum 上传类型 + * @param fileName 带后缀的文件名 + * @return + */ + FileUploadSuccessDTO uploadSingle(InputStream inputStream, UploadTypeEnum uploadTypeEnum, String fileName); + + /** + * 单文件上传 + * + * @param token token + * @param uploadFile 上传文件 + * @param uploadTypeEnum 上传类型 + * @return + */ + FileUploadSuccessDTO uploadSingleByToken(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum); + + /** + * 单文件上传 + * + * @param token + * @param inputStream + * @param uploadTypeEnum + * @param fileName + * @return + */ + FileUploadSuccessDTO uploadSingleByToken(String token, InputStream inputStream, UploadTypeEnum uploadTypeEnum, String fileName); + + /** + * 单文件上传 + * + * @param userId 用户ID + * @param uploadFile 上传文件 + * @param uploadTypeEnum 上传类型 + * @return + */ + FileUploadSuccessDTO uploadSingleByUserId(String userId, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum); + + + /** + * 单文件上传 + * + * @param userId + * @param inputStream + * @param uploadTypeEnum + * @param fileName + * @return + */ + FileUploadSuccessDTO uploadSingleByUserId(String userId, InputStream inputStream, UploadTypeEnum uploadTypeEnum, String fileName); + + /** + * 保存文件 + * + * @param fileSaveVO + * @return + */ + FileUploadSuccessDTO saveFile(FileSaveVO fileSaveVO); + + /** + * 修改文件VO + * + * @param fileUpdateVO + */ + void update(FileUpdateVO fileUpdateVO); + + /** + * 获取文件 + * + * @param params + * @return + */ + FilePO getPO(Map params); + + /** + * 获取文件 + * + * @param fileId + * @return + */ + FilePO getPO(String fileId); + +} diff --git a/module-file/src/main/java/ink/wgink/module/file/service/v2/IFileV2Service.java b/module-file/src/main/java/ink/wgink/module/file/service/v2/IFileV2Service.java deleted file mode 100644 index e4700f25..00000000 --- a/module-file/src/main/java/ink/wgink/module/file/service/v2/IFileV2Service.java +++ /dev/null @@ -1,66 +0,0 @@ -package ink.wgink.module.file.service.v2; - -import ink.wgink.module.file.enums.UploadTypeEnum; -import ink.wgink.module.file.pojo.dtos.FileUploadSuccessDTO; -import ink.wgink.pojo.pos.FilePO; -import org.springframework.web.multipart.MultipartFile; - -import java.util.Map; - -/** - * @ClassName: IFileV2Service - * @Description: 文件V2 - * @Author: wanggeng - * @Date: 2022/4/13 16:15 - * @Version: 1.0 - */ -public interface IFileV2Service { - - /** - * 单文件上传 - * - * @param uploadFile 上传文件 - * @param uploadTypeEnum 上传类型 - * @param requestParams 请求参数 - * @return - */ - FileUploadSuccessDTO uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map requestParams); - - /** - * 单文件上传 - * - * @param token token - * @param uploadFile 上传文件 - * @param uploadTypeEnum 上传类型 - * @param requestParams 请求参数 - * @return - */ - FileUploadSuccessDTO uploadSingleByToken(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map requestParams); - - /** - * 单文件上传 - * - * @param userId 用户ID - * @param uploadFile 上传文件 - * @param uploadTypeEnum 上传类型 - * @param requestParams 请求参数 - * @return - */ - FileUploadSuccessDTO uploadSingleByUserId(String userId, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map requestParams); - - /** - * 获取文件 - * - * @param params - * @return - */ - FilePO getPO(Map params); - - /** - * 获取文件 - * - * @param fileId - * @return - */ - FilePO getPO(String fileId); -} diff --git a/module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileServiceImpl.java b/module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileServiceImpl.java new file mode 100644 index 00000000..1e049939 --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileServiceImpl.java @@ -0,0 +1,171 @@ +package ink.wgink.module.file.service.v2.impl; + +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.exceptions.SearchException; +import ink.wgink.module.file.components.FileComponent; +import ink.wgink.module.file.dao.IFileDao; +import ink.wgink.module.file.enums.UploadTypeEnum; +import ink.wgink.module.file.pojo.dtos.v2.FileUploadSuccessDTO; +import ink.wgink.module.file.pojo.vos.v2.FileSaveVO; +import ink.wgink.module.file.pojo.vos.v2.FileUpdateVO; +import ink.wgink.module.file.service.v2.IFileService; +import ink.wgink.pojo.pos.FilePO; +import ink.wgink.util.UUIDUtil; +import ink.wgink.util.date.DateUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +/** + * @ClassName: FileV2ServiceImpl + * @Description: 文件V2 + * @Author: wanggeng + * @Date: 2022/4/13 16:15 + * @Version: 1.0 + */ +@Service("fileServiceV2") +public class FileServiceImpl extends DefaultBaseService implements IFileService { + + @Autowired + private FileComponent fileComponent; + @Autowired + private IFileDao fileDao; + + @Override + public FileUploadSuccessDTO uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum) { + FileSaveVO fileSaveVO = getFileSaveVO(uploadFile, uploadTypeEnum); + fileSaveVO.setCreator(securityComponent.getCurrentUser().getUserId()); + return saveFile(fileSaveVO); + } + + @Override + public FileUploadSuccessDTO uploadSingle(InputStream inputStream, UploadTypeEnum uploadTypeEnum, String fileName) { + FileSaveVO fileSaveVO = getFileSaveVO(inputStream, uploadTypeEnum, fileName); + fileSaveVO.setCreator(securityComponent.getCurrentUser().getUserId()); + return saveFile(fileSaveVO); + } + + + @Override + public FileUploadSuccessDTO uploadSingleByToken(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum) { + FileSaveVO fileSaveVO = getFileSaveVO(uploadFile, uploadTypeEnum); + fileSaveVO.setCreator(getAppTokenUser(token).getId()); + return saveFile(fileSaveVO); + } + + @Override + public FileUploadSuccessDTO uploadSingleByToken(String token, InputStream inputStream, UploadTypeEnum uploadTypeEnum, String fileName) { + FileSaveVO fileSaveVO = getFileSaveVO(inputStream, uploadTypeEnum, fileName); + fileSaveVO.setCreator(getAppTokenUser(token).getId()); + return saveFile(fileSaveVO); + } + + @Override + public FileUploadSuccessDTO uploadSingleByUserId(String userId, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum) { + FileSaveVO fileSaveVO = getFileSaveVO(uploadFile, uploadTypeEnum); + fileSaveVO.setCreator(userId); + return saveFile(fileSaveVO); + } + + @Override + public FileUploadSuccessDTO uploadSingleByUserId(String userId, InputStream inputStream, UploadTypeEnum uploadTypeEnum, String fileName) { + FileSaveVO fileSaveVO = getFileSaveVO(inputStream, uploadTypeEnum, fileName); + fileSaveVO.setCreator(userId); + return saveFile(fileSaveVO); + } + + @Override + public FileUploadSuccessDTO saveFile(FileSaveVO fileSaveVO) { + String fileId = UUIDUtil.getUUID(); + Map params = getHashMap(10); + params.put("fileId", fileId); + params.put("fileName", fileSaveVO.getFileName()); + params.put("filePath", fileSaveVO.getUploadPath()); + params.put("fileUrl", fileComponent.getFileUrl(fileSaveVO.getUploadPath())); + params.put("fileType", fileSaveVO.getFileType()); + params.put("fileSize", fileSaveVO.getFileSize()); + params.put("isBack", 0); + + String time = DateUtil.getTime(); + params.put("creator", fileSaveVO.getCreator()); + params.put("modifier", fileSaveVO.getCreator()); + params.put("gmtCreate", time); + params.put("gmtModified", time); + params.put("isDelete", 0); + fileDao.save(params); + + return new FileUploadSuccessDTO(fileId, fileSaveVO.getFileName(), fileSaveVO.getFileSize()); + } + + @Override + public void update(FileUpdateVO fileUpdateVO) { + Map params = getHashMap(10); + params.put("fileId", fileUpdateVO.getFileId()); + params.put("fileName", fileUpdateVO.getFileName()); + params.put("filePath", fileUpdateVO.getUploadPath()); + params.put("fileUrl", fileComponent.getFileUrl(fileUpdateVO.getUploadPath())); + params.put("fileType", fileUpdateVO.getFileType()); + params.put("fileSize", fileUpdateVO.getFileSize()); + params.put("modifier", fileUpdateVO.getCreator()); + params.put("gmtModified", DateUtil.getTime()); + fileDao.update(params); + } + + @Override + public FilePO getPO(Map params) { + return fileDao.getPO(params); + } + + @Override + public FilePO getPO(String fileId) { + Map params = getHashMap(2); + params.put("fileId", fileId); + return getPO(params); + } + + /** + * 获取文件保存VO + * + * @param uploadFile + * @param uploadTypeEnum + * @return + */ + private FileSaveVO getFileSaveVO(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum) { + String fileName = uploadFile.getOriginalFilename(); + InputStream inputStream; + try { + inputStream = uploadFile.getInputStream(); + } catch (IOException e) { + throw new SearchException(e); + } + return getFileSaveVO(inputStream, uploadTypeEnum, fileName); + } + + /** + * 获取文件保存VO + * + * @param inputStream + * @param uploadTypeEnum + * @param fileName + * @return + */ + private FileSaveVO getFileSaveVO(InputStream inputStream, UploadTypeEnum uploadTypeEnum, String fileName) { + String fileType = fileComponent.getFileType(fileName); + String uploadPath = fileComponent.getUploadPath(uploadTypeEnum, fileType); + String uuidFileName = UUIDUtil.get32UUID() + "." + fileType; + long fileSize = fileComponent.saveFile(inputStream, uuidFileName, uploadPath); + // 保存文件 + FileSaveVO fileSaveVO = new FileSaveVO(); + fileSaveVO.setFileName(fileName); + fileSaveVO.setFileType(fileType); + fileSaveVO.setUploadPath(uploadPath + File.separator + uuidFileName); + fileSaveVO.setFileSize(fileSize); + return fileSaveVO; + } + +} diff --git a/module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileV2ServiceImpl.java b/module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileV2ServiceImpl.java deleted file mode 100644 index e234047d..00000000 --- a/module-file/src/main/java/ink/wgink/module/file/service/v2/impl/FileV2ServiceImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -package ink.wgink.module.file.service.v2.impl; - -import ink.wgink.common.base.DefaultBaseService; -import ink.wgink.module.file.dao.IFileDao; -import ink.wgink.module.file.enums.UploadTypeEnum; -import ink.wgink.module.file.pojo.dtos.FileUploadSuccessDTO; -import ink.wgink.module.file.service.IFileService; -import ink.wgink.module.file.service.v2.IFileV2Service; -import ink.wgink.pojo.pos.FilePO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.util.Map; - -/** - * @ClassName: FileV2ServiceImpl - * @Description: 文件V2 - * @Author: wanggeng - * @Date: 2022/4/13 16:15 - * @Version: 1.0 - */ -@Service -public class FileV2ServiceImpl extends DefaultBaseService implements IFileV2Service { - - @Autowired - private IFileService fileService; - @Autowired - private IFileDao fileDao; - - @Override - public FileUploadSuccessDTO uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map requestParams) { - fileService.uploadSingle(uploadFile, uploadTypeEnum, requestParams); - FileUploadSuccessDTO fileUploadSuccessDTO = new FileUploadSuccessDTO(); - fileUploadSuccessDTO.setFileId(requestParams.get("fileId").toString()); - fileUploadSuccessDTO.setFileName(requestParams.get("fileName").toString()); - fileUploadSuccessDTO.setFileSize(Long.valueOf(requestParams.get("fileSize").toString())); - return fileUploadSuccessDTO; - } - - @Override - public FileUploadSuccessDTO uploadSingleByToken(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map requestParams) { - fileService.uploadSingle(token, uploadFile, uploadTypeEnum, requestParams); - FileUploadSuccessDTO fileUploadSuccessDTO = new FileUploadSuccessDTO(); - fileUploadSuccessDTO.setFileId(requestParams.get("fileId").toString()); - fileUploadSuccessDTO.setFileName(requestParams.get("fileName").toString()); - fileUploadSuccessDTO.setFileSize(Long.valueOf(requestParams.get("fileSize").toString())); - return fileUploadSuccessDTO; - } - - @Override - public FileUploadSuccessDTO uploadSingleByUserId(String userId, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map requestParams) { - fileService.uploadSingleByUserId(userId, uploadFile, uploadTypeEnum, requestParams); - FileUploadSuccessDTO fileUploadSuccessDTO = new FileUploadSuccessDTO(); - fileUploadSuccessDTO.setFileId(requestParams.get("fileId").toString()); - fileUploadSuccessDTO.setFileName(requestParams.get("fileName").toString()); - fileUploadSuccessDTO.setFileSize(Long.valueOf(requestParams.get("fileSize").toString())); - return fileUploadSuccessDTO; - } - - @Override - public FilePO getPO(Map params) { - return fileDao.getPO(params); - } - - @Override - public FilePO getPO(String fileId) { - Map params = getHashMap(2); - params.put("fileId", fileId); - return getPO(params); - } - -} diff --git a/module-file/src/main/resources/mybatis/mapper/file-mapper.xml b/module-file/src/main/resources/mybatis/mapper/file-mapper.xml index f5e7d404..233b6aee 100644 --- a/module-file/src/main/resources/mybatis/mapper/file-mapper.xml +++ b/module-file/src/main/resources/mybatis/mapper/file-mapper.xml @@ -2,8 +2,6 @@ - - @@ -63,7 +61,7 @@ - + INSERT INTO sys_file( file_id, file_name, @@ -96,7 +94,7 @@ - + UPDATE sys_file SET @@ -111,7 +109,7 @@ - + DELETE FROM sys_file WHERE @@ -122,7 +120,41 @@ - + + UPDATE + sys_file + SET + + file_name = #{fileName}, + + + file_path = #{filePath}, + + + file_url = #{fileUrl}, + + + file_type = #{fileType}, + + + file_size = #{fileSize}, + + modifier = #{modifier}, + gmt_modified = #{gmtModified} + WHERE + + file_id = #{fileId} + + + file_id IN + + #{fileIds[${index}]} + + + + + + UPDATE sys_file SET @@ -140,7 +172,7 @@ - SELECT file_id, file_name, @@ -213,7 +245,7 @@ - SELECT file_id, file_name, @@ -254,7 +286,7 @@ - SELECT file_id, file_name, @@ -278,7 +310,7 @@ - SELECT file_id, file_name,