From 693941492a4af26dde34312411823beec4d4b59c Mon Sep 17 00:00:00 2001 From: MoeexT Date: Fri, 10 Apr 2026 17:25:16 +0800 Subject: [PATCH 1/4] fix: add file directory error --- .../DatasetFileApplicationService.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java index 4427c389..76679867 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java @@ -124,7 +124,7 @@ public PagedResponse getDatasetFilesWithDirectory(String datasetId, } // 使用 Path API 安全地构建路径 - Path basePath = Paths.get(datasetPath); + Path basePath = Paths.get(datasetPath).normalize(); Path queryPath = prefix.isEmpty() ? basePath : basePath.resolve(prefix).normalize(); // 确保查询路径在数据集路径下(防止路径遍历) @@ -149,7 +149,7 @@ public PagedResponse getDatasetFilesWithDirectory(String datasetId, try (Stream pathStream = Files.list(queryPath)) { List allFiles = pathStream - .filter(path -> path.toString().startsWith(datasetPath)) + .filter(path -> path.normalize().startsWith(basePath)) .sorted(Comparator .comparing((Path path) -> !Files.isDirectory(path)) .thenComparing(path -> path.getFileName().toString())) @@ -694,7 +694,7 @@ public void createDirectory(String datasetId, CreateDirectoryRequest req) { throw BusinessException.of(CommonErrorCode.PARAM_ERROR); } - Path basePath = Paths.get(datasetPath); + Path basePath = Paths.get(datasetPath).normalize(); Path targetPath = parentPrefix.isEmpty() ? basePath.resolve(directoryName) : basePath.resolve(parentPrefix).resolve(directoryName); @@ -1149,19 +1149,29 @@ private void addFile(String sourPath, String targetPath, boolean softAdd) { private static DatasetFile getDatasetFileForAdd(AddFilesRequest req, AddFilesRequest.FileRequest file, Dataset dataset, ObjectMapper objectMapper) throws JsonProcessingException { - Path sourcePath = Paths.get(file.getFilePath()); + Path sourcePath = Paths.get(file.getFilePath()).normalize(); File sourceFile = sourcePath.toFile(); file.getMetadata().put("softAdd", req.isSoftAdd()); LocalDateTime currentTime = LocalDateTime.now(); String fileName = sourcePath.getFileName().toString(); + Path datasetPath = Paths.get(dataset.getPath()).normalize(); + String filePath; + if (sourcePath.startsWith(datasetPath)) { + // 源文件已在数据集目录内,直接使用源文件路径,不复制 + filePath = sourcePath.toString(); + } else { + // 源文件在数据集目录外,构造目标路径 + filePath = Paths.get(dataset.getPath(), req.getPrefix(), fileName).toString(); + } + return DatasetFile.builder() .id(UUID.randomUUID().toString()) .datasetId(dataset.getId()) .fileName(fileName) .fileType(AnalyzerUtils.getExtension(fileName)) .fileSize(sourceFile.length()) - .filePath(Paths.get(dataset.getPath(), req.getPrefix(), fileName).toString()) + .filePath(filePath) .uploadTime(currentTime) .lastAccessTime(currentTime) .metadata(objectMapper.writeValueAsString(file.getMetadata())) From 4e8edba54535c8dc9c9651f6630eab63cda786bf Mon Sep 17 00:00:00 2001 From: MoeexT Date: Fri, 17 Apr 2026 15:38:30 +0800 Subject: [PATCH 2/4] Revert "fix: add file directory error" This reverts commit 693941492a4af26dde34312411823beec4d4b59c. --- .../DatasetFileApplicationService.java | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java index 76679867..4427c389 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java @@ -124,7 +124,7 @@ public PagedResponse getDatasetFilesWithDirectory(String datasetId, } // 使用 Path API 安全地构建路径 - Path basePath = Paths.get(datasetPath).normalize(); + Path basePath = Paths.get(datasetPath); Path queryPath = prefix.isEmpty() ? basePath : basePath.resolve(prefix).normalize(); // 确保查询路径在数据集路径下(防止路径遍历) @@ -149,7 +149,7 @@ public PagedResponse getDatasetFilesWithDirectory(String datasetId, try (Stream pathStream = Files.list(queryPath)) { List allFiles = pathStream - .filter(path -> path.normalize().startsWith(basePath)) + .filter(path -> path.toString().startsWith(datasetPath)) .sorted(Comparator .comparing((Path path) -> !Files.isDirectory(path)) .thenComparing(path -> path.getFileName().toString())) @@ -694,7 +694,7 @@ public void createDirectory(String datasetId, CreateDirectoryRequest req) { throw BusinessException.of(CommonErrorCode.PARAM_ERROR); } - Path basePath = Paths.get(datasetPath).normalize(); + Path basePath = Paths.get(datasetPath); Path targetPath = parentPrefix.isEmpty() ? basePath.resolve(directoryName) : basePath.resolve(parentPrefix).resolve(directoryName); @@ -1149,29 +1149,19 @@ private void addFile(String sourPath, String targetPath, boolean softAdd) { private static DatasetFile getDatasetFileForAdd(AddFilesRequest req, AddFilesRequest.FileRequest file, Dataset dataset, ObjectMapper objectMapper) throws JsonProcessingException { - Path sourcePath = Paths.get(file.getFilePath()).normalize(); + Path sourcePath = Paths.get(file.getFilePath()); File sourceFile = sourcePath.toFile(); file.getMetadata().put("softAdd", req.isSoftAdd()); LocalDateTime currentTime = LocalDateTime.now(); String fileName = sourcePath.getFileName().toString(); - Path datasetPath = Paths.get(dataset.getPath()).normalize(); - String filePath; - if (sourcePath.startsWith(datasetPath)) { - // 源文件已在数据集目录内,直接使用源文件路径,不复制 - filePath = sourcePath.toString(); - } else { - // 源文件在数据集目录外,构造目标路径 - filePath = Paths.get(dataset.getPath(), req.getPrefix(), fileName).toString(); - } - return DatasetFile.builder() .id(UUID.randomUUID().toString()) .datasetId(dataset.getId()) .fileName(fileName) .fileType(AnalyzerUtils.getExtension(fileName)) .fileSize(sourceFile.length()) - .filePath(filePath) + .filePath(Paths.get(dataset.getPath(), req.getPrefix(), fileName).toString()) .uploadTime(currentTime) .lastAccessTime(currentTime) .metadata(objectMapper.writeValueAsString(file.getMetadata())) From 76583f5bfa1608a627663cd1150a90ebd8ed3ff9 Mon Sep 17 00:00:00 2001 From: MoeexT Date: Fri, 17 Apr 2026 16:04:59 +0800 Subject: [PATCH 3/4] feat: support prefix for each file(AddFilesRequest) --- .../DatasetFileApplicationService.java | 5 +-- .../interfaces/dto/AddFilesRequest.java | 33 +++++++++---------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java index 4427c389..f9007215 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java @@ -1057,9 +1057,6 @@ private void setDatasetFileId(DatasetFile datasetFile, Dataset dataset) { */ @Transactional public List addFilesToDataset(String datasetId, AddFilesRequest req) { - if (!req.isValidPrefix()) { - throw BusinessException.of(DataManagementErrorCode.DIRECTORY_NOT_FOUND); - } Dataset dataset = datasetRepository.getById(datasetId); BusinessAssert.notNull(dataset, SystemErrorCode.RESOURCE_NOT_FOUND); List addedFiles = new ArrayList<>(); @@ -1161,7 +1158,7 @@ private static DatasetFile getDatasetFileForAdd(AddFilesRequest req, AddFilesReq .fileName(fileName) .fileType(AnalyzerUtils.getExtension(fileName)) .fileSize(sourceFile.length()) - .filePath(Paths.get(dataset.getPath(), req.getPrefix(), fileName).toString()) + .filePath(Paths.get(dataset.getPath(), file.getPrefix(), fileName).toString()) .uploadTime(currentTime) .lastAccessTime(currentTime) .metadata(objectMapper.writeValueAsString(file.getMetadata())) diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java index 66fdde47..5c6bfce7 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java @@ -1,6 +1,7 @@ package com.datamate.datamanagement.interfaces.dto; import com.datamate.datamanagement.interfaces.validation.ValidPath; + import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; @@ -9,15 +10,15 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; + import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; /** - * AddFilesRequest1 + * AddFilesRequest * * @since 2026/2/9 */ @@ -26,14 +27,21 @@ @NoArgsConstructor @AllArgsConstructor public class AddFilesRequest { + private boolean softAdd; + + @NotEmpty(message = "文件列表不能为空") + @Size(max = 1000, message = "文件数量不能超过1000个") + @Valid + private List files; + public AddFilesRequest(List paths) { if (CollectionUtils.isEmpty(paths)) { return; } this.files = paths.stream().map(path -> { - AddFilesRequest.FileRequest file = new AddFilesRequest.FileRequest(); + FileRequest file = new FileRequest(); file.setFilePath(path); - return file; + return file; }).toList(); } @@ -44,20 +52,9 @@ public static class FileRequest { @Size(max = 1000, message = "文件路径长度不能超过1000个字符") private String filePath; - private Map metadata = new HashMap<>(); - } - - private boolean softAdd; - - @ValidPath() - private String prefix = ""; - - @NotEmpty(message = "文件列表不能为空") - @Size(max = 1000, message = "文件数量不能超过1000个") - @Valid - private List files; + @ValidPath + private String prefix = ""; - public boolean isValidPrefix() { - return StringUtils.isEmpty(prefix) || (!prefix.startsWith(".")); + private Map metadata = new HashMap<>(); } } From 763c46d0e4279930c4e4b222984eec1628195d20 Mon Sep 17 00:00:00 2001 From: MoeexT Date: Fri, 17 Apr 2026 16:11:43 +0800 Subject: [PATCH 4/4] feat: support prefix for each file(AddFilesRequest) --- .../application/DatasetFileApplicationService.java | 2 +- .../interfaces/dto/AddFilesRequest.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java index f9007215..43b81720 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java @@ -1158,7 +1158,7 @@ private static DatasetFile getDatasetFileForAdd(AddFilesRequest req, AddFilesReq .fileName(fileName) .fileType(AnalyzerUtils.getExtension(fileName)) .fileSize(sourceFile.length()) - .filePath(Paths.get(dataset.getPath(), file.getPrefix(), fileName).toString()) + .filePath(Paths.get(dataset.getPath(), req.getEffectivePrefix(file), fileName).toString()) .uploadTime(currentTime) .lastAccessTime(currentTime) .metadata(objectMapper.writeValueAsString(file.getMetadata())) diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java index 5c6bfce7..6416c192 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/AddFilesRequest.java @@ -1,7 +1,6 @@ package com.datamate.datamanagement.interfaces.dto; import com.datamate.datamanagement.interfaces.validation.ValidPath; - import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; @@ -10,7 +9,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; - import org.apache.commons.collections4.CollectionUtils; import java.util.HashMap; @@ -29,6 +27,9 @@ public class AddFilesRequest { private boolean softAdd; + @ValidPath + private String prefix = ""; + @NotEmpty(message = "文件列表不能为空") @Size(max = 1000, message = "文件数量不能超过1000个") @Valid @@ -45,6 +46,13 @@ public AddFilesRequest(List paths) { }).toList(); } + /** + * 获取文件的前缀,优先使用文件自身的 prefix,为空时回退到请求级别的 prefix + */ + public String getEffectivePrefix(FileRequest file) { + return (file.getPrefix() != null && !file.getPrefix().isEmpty()) ? file.getPrefix() : prefix; + } + @Getter @Setter public static class FileRequest {