From 2a8bd2c4a61e841bd5891d7517639891ee3e0aa2 Mon Sep 17 00:00:00 2001 From: jmal Date: Fri, 26 Jul 2024 11:40:32 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E7=A7=BB=E5=8A=A8=E6=88=96=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=E6=B7=BB=E5=8A=A0=E5=8F=AF=E8=A6=86=E7=9B=96=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/rest/FileController.java | 12 +++ .../clouddisk/model/UploadApiParamDTO.java | 5 ++ .../jmal/clouddisk/service/IFileService.java | 9 +++ .../service/impl/FileServiceImpl.java | 74 ++++++++++--------- 4 files changed, 66 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/jmal/clouddisk/controller/rest/FileController.java b/src/main/java/com/jmal/clouddisk/controller/rest/FileController.java index f518578e..a14fc23a 100644 --- a/src/main/java/com/jmal/clouddisk/controller/rest/FileController.java +++ b/src/main/java/com/jmal/clouddisk/controller/rest/FileController.java @@ -372,6 +372,18 @@ public ResponseResult rename(@RequestParam String newFileName, @RequestP return fileService.rename(URLUtil.decode(newFileName), username, id, folder); } + @Operation(summary = "移动或复制前检查目标目录是否存在要移动或复制的文件") + @GetMapping("/check-move-copy") + @Permission("cloud:file:update") + public ResponseResult> checkMoveOrCopy(UploadApiParamDTO upload, @RequestParam String[] froms, String to) throws IOException { + if (froms != null && froms.length > 0) { + List list = Arrays.asList(froms); + return fileService.checkMoveOrCopy(upload, list, to); + } else { + throw new CommonException(ExceptionType.MISSING_PARAMETERS.getCode(), ExceptionType.MISSING_PARAMETERS.getMsg()); + } + } + @Operation(summary = "移动文件/文件夹") @GetMapping("/move") @LogOperatingFun diff --git a/src/main/java/com/jmal/clouddisk/model/UploadApiParamDTO.java b/src/main/java/com/jmal/clouddisk/model/UploadApiParamDTO.java index 6690c184..f30f5aa9 100644 --- a/src/main/java/com/jmal/clouddisk/model/UploadApiParamDTO.java +++ b/src/main/java/com/jmal/clouddisk/model/UploadApiParamDTO.java @@ -196,6 +196,11 @@ public class UploadApiParamDTO { */ Boolean hideMountFile; + /** + * 是否覆盖, 用于移动或复制文件 + */ + Boolean isOverride; + @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime uploadDate; diff --git a/src/main/java/com/jmal/clouddisk/service/IFileService.java b/src/main/java/com/jmal/clouddisk/service/IFileService.java index c51abc63..ae39f624 100644 --- a/src/main/java/com/jmal/clouddisk/service/IFileService.java +++ b/src/main/java/com/jmal/clouddisk/service/IFileService.java @@ -219,6 +219,15 @@ public interface IFileService { */ ResponseResult rename(String newFileName, String username, String id, String folder); + /** + * 移动或复制前检查目标目录是否存在要移动或复制的文件 + * @param upload 上传参数 + * @param froms 从哪里来 + * @param to 要到哪里去 + * @return ResponseResult + */ + ResponseResult> checkMoveOrCopy(UploadApiParamDTO upload, List froms, String to) throws IOException; + /** * 移动文件/文件夹 * @param upload 上传参数 diff --git a/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java b/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java index bce00d58..b5f97e4f 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java @@ -907,6 +907,26 @@ private void afterRenameFile(String fileId, String newFileName) { luceneService.pushCreateIndexQueue(fileId); } + @Override + public ResponseResult> checkMoveOrCopy(UploadApiParamDTO upload, List froms, String to) { + List fromFilenameList = getFromFilenameList(froms); + FileDocument toFileDocument = getToFileDocument(upload, to); + String toPath = getRelativePath(toFileDocument); + Query query = new Query(); + query.addCriteria(Criteria.where(USER_ID).is(toFileDocument.getUserId())); + query.addCriteria(Criteria.where("path").is(toPath)); + query.addCriteria(Criteria.where("name").in(fromFilenameList)); + List fileDocuments = mongoTemplate.find(query, FileDocument.class, COLLECTION_NAME); + return ResultUtil.success(fileDocuments).setCount(fileDocuments.size()); + } + + private List getFromFilenameList(List froms) { + Query query = new Query(); + query.addCriteria(Criteria.where("_id").in(froms)); + query.fields().include("name"); + return mongoTemplate.find(query, FileDocument.class, COLLECTION_NAME).stream().map(FileDocument::getName).toList(); + } + @Override public ResponseResult move(UploadApiParamDTO upload, List froms, String to) throws IOException { // 复制 @@ -955,7 +975,7 @@ private void getCopyResult(UploadApiParamDTO upload, List froms, String for (String from : froms) { ResponseResult result; try { - result = copy(upload, from, to, move); + result = copyOrMove(upload, from, to, move); } catch (CommonException e) { throw e; } catch (Exception e) { @@ -1504,19 +1524,10 @@ private static ResponseResult folderDuplicateDisallowed() { * @param from 来源文件id * @param to 目标文件id */ - private ResponseResult copy(UploadApiParamDTO upload, String from, String to, boolean move) { + private ResponseResult copyOrMove(UploadApiParamDTO upload, String from, String to, boolean move) { FileDocument formFileDocument = getOriginalFileDocumentById(from); String fromPath = getRelativePath(formFileDocument); - FileDocument toFileDocument; - if (Constants.REGION_DEFAULT.equals(to)) { - // 复制到根目录 - toFileDocument = new FileDocument(); - toFileDocument.setPath("/"); - toFileDocument.setName(""); - toFileDocument.setUserId(upload.getUserId()); - } else { - toFileDocument = getOriginalFileDocumentById(to); - } + FileDocument toFileDocument = getToFileDocument(upload, to); ResponseResult result = ossCopy(formFileDocument, toFileDocument, from, to, move); if (result != null) { return result; @@ -1539,20 +1550,14 @@ private ResponseResult copy(UploadApiParamDTO upload, String from, Strin if (!upload.getUsername().equals(toUsername)) { checkPermissionUsername(toUsername, toFileDocument.getOperationPermissionList(), OperationPermission.UPLOAD); } - String toFilePath = Paths.get(getUserDir(toUsername), toPath).toString(); - Path pathTo = Paths.get(toFileDocument.getPath(), toFileDocument.getName()); formFileDocument.setUserId(toFileDocument.getUserId()); - - FileDocument copyFileDocument = copyFileDocument(formFileDocument, toPath); - if (isExistsOfToCopy(copyFileDocument, toPath)) { - throw new CommonException(ExceptionType.WARNING.getCode(), Constants.COPY_EXISTS_FILE); - } + boolean isOverride = BooleanUtil.isTrue(upload.getIsOverride()); if (move) { - FileUtil.move(new File(fromFilePath), new File(toFilePath), true); + FileUtil.move(new File(fromFilePath), new File(toFilePath), isOverride); } else { - FileUtil.copy(fromFilePath, toFilePath, true); + FileUtil.copy(fromFilePath, toFilePath, isOverride); } String operation = move ? "移动" : "复制"; // 复制成功 @@ -1563,6 +1568,20 @@ private ResponseResult copy(UploadApiParamDTO upload, String from, Strin return ResultUtil.error("复制失败"); } + private FileDocument getToFileDocument(UploadApiParamDTO upload, String to) { + FileDocument toFileDocument; + if (Constants.REGION_DEFAULT.equals(to)) { + // 复制到根目录 + toFileDocument = new FileDocument(); + toFileDocument.setPath("/"); + toFileDocument.setName(""); + toFileDocument.setUserId(upload.getUserId()); + } else { + toFileDocument = getOriginalFileDocumentById(to); + } + return toFileDocument; + } + private void saveFileDocument(FileDocument fileDocument) { File file = getFileByFileDocument(fileDocument); String username = userService.getUserNameById(fileDocument.getUserId()); @@ -1614,19 +1633,6 @@ private FileDocument copyFileDocument(FileDocument formFileDocument, String toPa return formFileDocument; } - /*** - * 目标目录是否存该文件 - * @param formFileDocument FileDocument - * @param toPath toPath - */ - private boolean isExistsOfToCopy(FileDocument formFileDocument, String toPath) { - Query query = new Query(); - query.addCriteria(Criteria.where(USER_ID).is(formFileDocument.getUserId())); - query.addCriteria(Criteria.where("path").is(toPath)); - query.addCriteria(Criteria.where("name").is(formFileDocument.getName())); - return mongoTemplate.exists(query, COLLECTION_NAME); - } - private static String replaceStart(String str, CharSequence searchStr, CharSequence replacement) { return replacement + str.substring(searchStr.length()); }