From 63d82cfe81829dc17112919f88b2ef1072ea7723 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Sat, 1 Aug 2026 22:54:54 +0800 Subject: [PATCH] fix: return absolute upload file urls --- .../common/CommonUploadController.java | 15 ++++++- src/main/resources/application-dev.yml | 2 +- .../common/CommonUploadControllerTest.java | 40 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/sztzjy/linkCommerce/controller/common/CommonUploadControllerTest.java diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java b/src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java index 97f9114..2c6580d 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java @@ -1,6 +1,7 @@ package com.sztzjy.linkCommerce.controller.common; import com.sztzjy.linkCommerce.util.file.IFileUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; @@ -17,6 +18,9 @@ public class CommonUploadController { @Resource private IFileUtil fileUtil; + @Value("${file.url}") + private String fileUrl; + @PostMapping("/upload") public Map upload(@RequestPart("file") MultipartFile file) { Map result = new HashMap<>(); @@ -27,7 +31,7 @@ public class CommonUploadController { } String filePath = fileUtil.upload(file); - String publicPath = "/file" + filePath; + String publicPath = publicFileUrl(filePath); result.put("code", 200); result.put("msg", "上传成功"); result.put("fileName", publicPath); @@ -35,4 +39,13 @@ public class CommonUploadController { result.put("originalFilename", file.getOriginalFilename()); return result; } + + private String publicFileUrl(String filePath) { + String baseUrl = fileUrl == null ? "" : fileUrl.trim(); + while (baseUrl.endsWith("/")) { + baseUrl = baseUrl.substring(0, baseUrl.length() - 1); + } + String relativePath = filePath == null ? "" : filePath.trim(); + return baseUrl + (relativePath.startsWith("/") ? relativePath : "/" + relativePath); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 43668dd..c7f826b 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -21,7 +21,7 @@ spring: file: type: local path: E:/workspace/dianshang/link_commerce/uploadFile - url: "http://localhost:7548/file" + url: ${FILE_URL:http://localhost:7548/file} #path: D:/tianzeProject/linkCommerce/ #url: "http://192.168.2.8:147/file" diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/common/CommonUploadControllerTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/common/CommonUploadControllerTest.java new file mode 100644 index 0000000..64b82eb --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/controller/common/CommonUploadControllerTest.java @@ -0,0 +1,40 @@ +package com.sztzjy.linkCommerce.controller.common; + +import com.sztzjy.linkCommerce.util.file.IFileUtil; +import org.junit.jupiter.api.Test; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.nio.charset.StandardCharsets; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class CommonUploadControllerTest { + + @Test + void uploadReturnsAbsoluteConfiguredFileUrl() { + IFileUtil fileUtil = mock(IFileUtil.class); + when(fileUtil.upload(any(MultipartFile.class))).thenReturn("/2026/8/1/example.docx"); + CommonUploadController controller = new CommonUploadController(); + ReflectionTestUtils.setField(controller, "fileUtil", fileUtil); + ReflectionTestUtils.setField(controller, "fileUrl", "https://files.example.com/file/"); + + MockMultipartFile file = new MockMultipartFile( + "file", + "case.docx", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "case".getBytes(StandardCharsets.UTF_8) + ); + + Map result = controller.upload(file); + + assertEquals("https://files.example.com/file/2026/8/1/example.docx", result.get("url")); + assertEquals(result.get("url"), result.get("fileName")); + assertEquals("case.docx", result.get("originalFilename")); + } +}