diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java index cfc85a7..4007aa6 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java @@ -47,7 +47,14 @@ public class FileServiceImpl implements FileService { * 目的:保证文件的唯一性,避免覆盖 * 定制:可按需调整成 UUID、或者其他方式 */ - static boolean PATH_SUFFIX_TIMESTAMP_ENABLE = true; + static boolean PATH_SUFFIX_TIMESTAMP_ENABLE = false; + /** + * 时间戳是否作为上级目录 + * + * true:{@code yyyyMMdd/timestamp/原文件名.ext};保留原文件名 + * false:{@code yyyyMMdd/原文件名_timestamp.ext};时间戳拼到文件名 + */ + static boolean PATH_TIMESTAMP_AS_DIRECTORY = true; @Resource private FileConfigService fileConfigService; @@ -102,12 +109,22 @@ public class FileServiceImpl implements FileService { } String suffix = null; if (PATH_SUFFIX_TIMESTAMP_ENABLE) { + // 5 位随机数,避免同一毫秒内的重复 suffix = String.valueOf(System.currentTimeMillis()) + RandomUtil.randomInt(10000, 100000); } // 2.1 先拼接 suffix 后缀 if (StrUtil.isNotEmpty(suffix)) { - name = suffix + StrUtil.SLASH + name; + if (PATH_TIMESTAMP_AS_DIRECTORY) { + name = suffix + StrUtil.SLASH + name; + } else { + String ext = FileUtil.extName(name); + if (StrUtil.isNotEmpty(ext)) { + name = FileUtil.mainName(name) + StrUtil.C_UNDERLINE + suffix + StrUtil.DOT + ext; + } else { + name = name + StrUtil.C_UNDERLINE + suffix; + } + } } // 2.2 再拼接 prefix 前缀 if (StrUtil.isNotEmpty(prefix)) { diff --git a/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java b/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java index 4eb3b36..9656def 100644 --- a/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java +++ b/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java @@ -42,6 +42,7 @@ public class FileServiceImplTest extends BaseDbUnitTest { public void setUp() { FileServiceImpl.PATH_PREFIX_DATE_ENABLE = true; FileServiceImpl.PATH_SUFFIX_TIMESTAMP_ENABLE = true; + FileServiceImpl.PATH_TIMESTAMP_AS_DIRECTORY = true; } @Test @@ -291,6 +292,57 @@ public class FileServiceImplTest extends BaseDbUnitTest { } @Test + public void testGenerateUploadPath_TimestampAsName_AllEnabled() { + // 准备参数 + String name = "test.jpg"; + String directory = "avatar"; + FileServiceImpl.PATH_PREFIX_DATE_ENABLE = true; + FileServiceImpl.PATH_SUFFIX_TIMESTAMP_ENABLE = true; + FileServiceImpl.PATH_TIMESTAMP_AS_DIRECTORY = false; + + // 调用 + String path = fileService.generateUploadPath(name, directory); + + // 断言 + // 格式为:avatar/yyyyMMdd/test_timestamp.jpg + assertTrue(path.matches(directory + "/\\d{8}/test_\\d+\\.jpg")); + } + + @Test + public void testGenerateUploadPath_TimestampAsName_PrefixDisabled() { + // 准备参数 + String name = "test.jpg"; + String directory = "avatar"; + FileServiceImpl.PATH_PREFIX_DATE_ENABLE = false; + FileServiceImpl.PATH_SUFFIX_TIMESTAMP_ENABLE = true; + FileServiceImpl.PATH_TIMESTAMP_AS_DIRECTORY = false; + + // 调用 + String path = fileService.generateUploadPath(name, directory); + + // 断言 + // 格式为:avatar/test_timestamp.jpg + assertTrue(path.matches(directory + "/test_\\d+\\.jpg")); + } + + @Test + public void testGenerateUploadPath_TimestampAsName_NoExtension() { + // 准备参数 + String name = "test"; + String directory = "avatar"; + FileServiceImpl.PATH_PREFIX_DATE_ENABLE = true; + FileServiceImpl.PATH_SUFFIX_TIMESTAMP_ENABLE = true; + FileServiceImpl.PATH_TIMESTAMP_AS_DIRECTORY = false; + + // 调用 + String path = fileService.generateUploadPath(name, directory); + + // 断言 + // 格式为:avatar/yyyyMMdd/test_timestamp + assertTrue(path.matches(directory + "/\\d{8}/test_\\d+")); + } + + @Test public void testGenerateUploadPath_DirectoryEmpty() { // 准备参数 String name = "test.jpg";