diff --git a/src/main/java/run/halo/app/handler/file/FilePathDescriptor.java b/src/main/java/run/halo/app/handler/file/FilePathDescriptor.java index 74baf7324..44edd5c94 100644 --- a/src/main/java/run/halo/app/handler/file/FilePathDescriptor.java +++ b/src/main/java/run/halo/app/handler/file/FilePathDescriptor.java @@ -151,7 +151,7 @@ public final class FilePathDescriptor { sb.append(first); for (String segment : more) { if (StringUtils.isNotBlank(segment)) { - if (sb.length() > 0) { + if (sb.length() > 0 && !endsWith(sb, separator)) { sb.append(separator); } sb.append(segment); @@ -162,6 +162,14 @@ public final class FilePathDescriptor { return path; } + static boolean endsWith(StringBuilder sb, String str) { + Assert.notNull(sb, "The stringBuilder must not be null."); + Assert.notNull(str, "The str must not be null."); + int len = sb.length(); + int strLen = str.length(); + return (len >= strLen && sb.substring(len - strLen).equals(str)); + } + /** * build file path object. * diff --git a/src/test/java/run/halo/app/handler/file/FilePathDescriptorTest.java b/src/test/java/run/halo/app/handler/file/FilePathDescriptorTest.java index 7777b58dd..0da12ff6a 100644 --- a/src/test/java/run/halo/app/handler/file/FilePathDescriptorTest.java +++ b/src/test/java/run/halo/app/handler/file/FilePathDescriptorTest.java @@ -1,5 +1,6 @@ package run.halo.app.handler.file; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static run.halo.app.model.support.HaloConst.FILE_SEPARATOR; @@ -87,4 +88,29 @@ public class FilePathDescriptorTest { assertEquals("/home/halo/2021/10/1.4.9.png", descriptor.getFullPath()); assertEquals("2021/10/1.4.9.png", descriptor.getRelativePath()); } + + @Test + public void windowsSystem() { + FilePathDescriptor descriptor = new FilePathDescriptor.Builder() + .setBasePath("C:\\Users\\Halo NiuBi\\.halo\\") + .setSubPath("upload\\2022\\04\\") + .setSeparator("\\") + .setAutomaticRename(false) + .setRenamePredicate(builder -> true) + .setOriginalName("hello.jpg") + .build(); + + assertThat(descriptor).isNotNull(); + + assertThat(descriptor.getFullPath()).isEqualTo("C:\\Users\\Halo NiuBi\\" + + ".halo\\upload\\2022\\04\\hello.jpg"); + assertThat(descriptor.getRelativePath()).isEqualTo("upload\\2022\\04\\hello.jpg"); + + assertThat(descriptor.getBasePath()).isEqualTo("C:\\Users\\Halo NiuBi\\.halo\\"); + assertThat(descriptor.getSubPath()).isEqualTo("upload\\2022\\04\\"); + + assertThat(descriptor.getExtension()).isEqualTo("jpg"); + assertThat(descriptor.getName()).isEqualTo("hello"); + assertThat(descriptor.getFullName()).isEqualTo("hello.jpg"); + } }