Skip to content

Commit

Permalink
Merge pull request #141 from jamebal/develop
Browse files Browse the repository at this point in the history
perf: 移动或复制添加可覆盖选项
  • Loading branch information
jamebal authored Jul 26, 2024
2 parents 9dec965 + 2a8bd2c commit 73df55f
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,18 @@ public ResponseResult<Object> 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<List<FileDocument>> checkMoveOrCopy(UploadApiParamDTO upload, @RequestParam String[] froms, String to) throws IOException {
if (froms != null && froms.length > 0) {
List<String> 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
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/jmal/clouddisk/model/UploadApiParamDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/jmal/clouddisk/service/IFileService.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,15 @@ public interface IFileService {
*/
ResponseResult<Object> rename(String newFileName, String username, String id, String folder);

/**
* 移动或复制前检查目标目录是否存在要移动或复制的文件
* @param upload 上传参数
* @param froms 从哪里来
* @param to 要到哪里去
* @return ResponseResult<Object>
*/
ResponseResult<List<FileDocument>> checkMoveOrCopy(UploadApiParamDTO upload, List<String> froms, String to) throws IOException;

/**
* 移动文件/文件夹
* @param upload 上传参数
Expand Down
74 changes: 40 additions & 34 deletions src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,26 @@ private void afterRenameFile(String fileId, String newFileName) {
luceneService.pushCreateIndexQueue(fileId);
}

@Override
public ResponseResult<List<FileDocument>> checkMoveOrCopy(UploadApiParamDTO upload, List<String> froms, String to) {
List<String> 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<FileDocument> fileDocuments = mongoTemplate.find(query, FileDocument.class, COLLECTION_NAME);
return ResultUtil.success(fileDocuments).setCount(fileDocuments.size());
}

private List<String> getFromFilenameList(List<String> 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<Object> move(UploadApiParamDTO upload, List<String> froms, String to) throws IOException {
// 复制
Expand Down Expand Up @@ -955,7 +975,7 @@ private void getCopyResult(UploadApiParamDTO upload, List<String> froms, String
for (String from : froms) {
ResponseResult<Object> result;
try {
result = copy(upload, from, to, move);
result = copyOrMove(upload, from, to, move);
} catch (CommonException e) {
throw e;
} catch (Exception e) {
Expand Down Expand Up @@ -1504,19 +1524,10 @@ private static ResponseResult<Object> folderDuplicateDisallowed() {
* @param from 来源文件id
* @param to 目标文件id
*/
private ResponseResult<Object> copy(UploadApiParamDTO upload, String from, String to, boolean move) {
private ResponseResult<Object> 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<Object> result = ossCopy(formFileDocument, toFileDocument, from, to, move);
if (result != null) {
return result;
Expand All @@ -1539,20 +1550,14 @@ private ResponseResult<Object> 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 ? "移动" : "复制";
// 复制成功
Expand All @@ -1563,6 +1568,20 @@ private ResponseResult<Object> 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());
Expand Down Expand Up @@ -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());
}
Expand Down

0 comments on commit 73df55f

Please sign in to comment.