diff --git a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java index 20fcccf..99788b8 100644 --- a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java +++ b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java @@ -3089,6 +3089,9 @@ public class TsFilesServiceImpl extends ServiceImpl impl List filteredRecords = tsFilesPage.getRecords().stream() .filter(tsFile -> { try { + if("FOLDER".equals(tsFile.getIsFile())){ + return false; + } // 计算本地文件MD5 File localFile = new File(filePathConfig.getValue() + tsFile.getWorkPath(), tsFile.getFileName()); String localMD5 = calculateMD5Data(new FileInputStream(localFile)); @@ -3173,6 +3176,9 @@ public class TsFilesServiceImpl extends ServiceImpl impl List filteredRecords = records.stream() .filter(tsFile -> { try { + if("FOLDER".equals(tsFile.getIsFile())){ + return false; + } // 计算本地文件MD5 File localFile = new File(filePathConfig.getValue() + tsFile.getWorkPath(), tsFile.getFileName()); String localMD5 = calculateMD5Data(new FileInputStream(localFile)); @@ -5016,18 +5022,19 @@ public class TsFilesServiceImpl extends ServiceImpl impl TsTask tsTask = tsTaskMapper.selectById(taskId); TableNameContextHolder.setTaskCode(tsTask.getTaskCode()); - StorageSource storageSourceLocal = getStorageConfig(tsTask.getLocalStorageId()); TsFiles tsFiles = tsFilesMapper.selectById(id); String fileNameData = tsFiles.getFileName(); String path = ""; + StorageSource storageSourceLocal = null; if ("local".equals(type)) { + storageSourceLocal = getStorageConfig(tsTask.getLocalStorageId()); String workPath = tsFiles.getWorkPath(); path = workPath + fileNameData; - } else { + }else { + storageSourceLocal = getStorageConfig(tsTask.getBackupStorageId()); String backupPath = tsFiles.getBackupPath(); path = backupPath + fileNameData; } - //准备获取文件的信息 AbstractBaseFileService fileService = storageSourceContext.getByStorageKey(storageSourceLocal.getKey()); fileItemResult = fileService.getFileItem(path); diff --git a/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/NodesServiceImpl.java b/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/NodesServiceImpl.java index 76806a5..e25a23a 100644 --- a/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/NodesServiceImpl.java +++ b/java/src/main/java/com/yfd/platform/modules/specialDocument/service/impl/NodesServiceImpl.java @@ -54,6 +54,7 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.sql.Timestamp; @@ -1642,7 +1643,7 @@ public class NodesServiceImpl extends ServiceImpl implements while ((entry = zis.getNextEntry()) != null) { processZipEntry(zis, entry, destRoot); } - return destRoot.toFile(); // 解压成功直接返回 + return destRoot.toFile(); } catch (IllegalArgumentException | IOException e) { LOGGER.debug("编码 {} 解压失败,尝试下一个编码", charset, e); } @@ -1661,11 +1662,23 @@ public class NodesServiceImpl extends ServiceImpl implements String sanitizedName = sanitizeFileName(entry.getName()); Path targetPath = buildSafePath(destRoot, sanitizedName); - // 3. 仅处理实际文件(跳过空目录) - if (!entry.isDirectory()) { + // 3. 处理目录(包括空目录) + if (entry.isDirectory()) { + createDirectory(targetPath); + } + // 4. 处理文件 + else { writeFileContent(zis, targetPath); } } + // 新增方法:专门处理目录创建 + private void createDirectory(Path dirPath) throws IOException { + // 确保路径安全后创建目录 + if (!java.nio.file.Files.exists(dirPath)) { + java.nio.file.Files.createDirectories(dirPath); + LOGGER.debug("创建空目录:{}", dirPath); + } + } /** * 判断是否需要跳过条目 @@ -1710,16 +1723,17 @@ public class NodesServiceImpl extends ServiceImpl implements * 写入文件内容(仅在需要时创建目录) */ private void writeFileContent(ZipInputStream zis, Path targetPath) throws IOException { + // 确保父目录存在 + Path parent = targetPath.getParent(); + if (parent != null && !java.nio.file.Files.exists(parent)) { + java.nio.file.Files.createDirectories(parent); + } + // 仅当文件不存在时才写入 if (!java.nio.file.Files.exists(targetPath)) { - // 按需创建父目录 - Path parent = targetPath.getParent(); - if (parent != null && !java.nio.file.Files.exists(parent)) { - java.nio.file.Files.createDirectories(parent); - } - - // 使用缓冲流提升性能 - try (BufferedOutputStream os = new BufferedOutputStream(java.nio.file.Files.newOutputStream(targetPath))) { + try (BufferedOutputStream os = new BufferedOutputStream( + java.nio.file.Files.newOutputStream(targetPath, StandardOpenOption.CREATE_NEW)) + ) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = zis.read(buffer)) != -1) { diff --git a/java/src/main/java/com/yfd/platform/modules/storage/convert/impl/StorageSourceConvertImpl.java b/java/src/main/java/com/yfd/platform/modules/storage/convert/impl/StorageSourceConvertImpl.java index 46e16f5..e1fa84b 100644 --- a/java/src/main/java/com/yfd/platform/modules/storage/convert/impl/StorageSourceConvertImpl.java +++ b/java/src/main/java/com/yfd/platform/modules/storage/convert/impl/StorageSourceConvertImpl.java @@ -211,9 +211,8 @@ public class StorageSourceConvertImpl implements StorageSourceConvert { return resultPage; } - // 计算本地路径的空间使用率 - public static String calculateLocalStorageUsage(String path) { - + // 计算本地路径的空间剩余率 + public static String calculateLocalStorageUsage(String path) { try { Path target = Paths.get(path); @@ -232,31 +231,43 @@ public class StorageSourceConvertImpl implements StorageSourceConvert { return "0%"; // 特殊文件系统处理 } - double usagePercentage = (double) (totalSpace - usableSpace) / totalSpace * 100; + double remainingPercentage = (double) usableSpace / totalSpace * 100; // 计算剩余空间百分比 DecimalFormat df = new DecimalFormat("#.##"); - return df.format(usagePercentage) + "%"; + return df.format(remainingPercentage) + "%"; } catch (Exception e) { throw new IllegalArgumentException("无法获取磁盘空间: " + e.getMessage()); } -// File file = new File(path); -// if (!file.exists()) { -// throw new IllegalArgumentException("路径不存在: " + path); -// } -// -// // 获取磁盘空间信息 -// long totalSpace = file.getTotalSpace(); -// long freeSpace = file.getFreeSpace(); -// // 计算使用率 -// long usedSpace = totalSpace - freeSpace; -// double usagePercentage = (double) usedSpace / totalSpace * 100; -// -// // 格式化输出 -// DecimalFormat df = new DecimalFormat("#.##"); -// -// return df.format(usagePercentage) + "%"; - } + // 计算本地路径的空间使用率 +// public static String calculateLocalStorageUsage(String path) { +// +// try { +// Path target = Paths.get(path); +// +// // 处理符号链接(获取实际挂载点) +// if (Files.isSymbolicLink(target)) { +// target = Files.readSymbolicLink(target); +// } +// +// // 获取文件存储信息 +// FileStore store = Files.getFileStore(target); +// +// long totalSpace = store.getTotalSpace(); +// long usableSpace = store.getUsableSpace(); +// +// if (totalSpace <= 0) { +// return "0%"; // 特殊文件系统处理 +// } +// +// double usagePercentage = (double) (totalSpace - usableSpace) / totalSpace * 100; +// DecimalFormat df = new DecimalFormat("#.##"); +// return df.format(usagePercentage) + "%"; +// +// } catch (Exception e) { +// throw new IllegalArgumentException("无法获取磁盘空间: " + e.getMessage()); +// } +// }