From 38b9b64809fb71a800b29160f41f7cc8f4713860 Mon Sep 17 00:00:00 2001 From: agentuser Date: Mon, 11 May 2026 17:13:01 +0800 Subject: [PATCH] feat: configurable download origin (gmp.download-origin), defaults to path-only --- .../gmp/mock/controller/DocxController.java | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gmp/mock/controller/DocxController.java b/src/main/java/com/gmp/mock/controller/DocxController.java index 0925ea3..0e3f670 100644 --- a/src/main/java/com/gmp/mock/controller/DocxController.java +++ b/src/main/java/com/gmp/mock/controller/DocxController.java @@ -2,6 +2,7 @@ package com.gmp.mock.controller; import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -19,7 +20,6 @@ import com.gmp.mock.service.DocxService; import com.gmp.mock.service.DocxService.CachedResult; import com.gmp.mock.service.FileCacheService; -import jakarta.servlet.http.HttpServletRequest; @RestController @RequestMapping("/api/docx") @@ -27,10 +27,13 @@ public class DocxController { private final DocxService docxService; private final FileCacheService fileCache; + private final String downloadOrigin; - public DocxController(DocxService docxService, FileCacheService fileCache) { + public DocxController(DocxService docxService, FileCacheService fileCache, + @Value("${gmp.download-origin:}") String downloadOrigin) { this.docxService = docxService; this.fileCache = fileCache; + this.downloadOrigin = downloadOrigin; } /** @@ -41,23 +44,23 @@ public class DocxController { * "code": 0, * "msg": "success", * "data": { - * "url": "http://localhost:6666/api/docx/download?id=xxxx", + * "url": "/api/docx/download?id=xxxx", * "fileName": "annualReport.docx" * } * } */ @PostMapping("/export") public ResponseEntity> exportDocx( - @Valid @RequestBody DocxExportRequest request, - HttpServletRequest httpRequest + @Valid @RequestBody DocxExportRequest request ) { CachedResult result = docxService.export(request.getExportId(), request.getBusinessData()); - // 构造下载 URL - String baseUrl = getBaseUrl(httpRequest); - String downloadUrl = baseUrl + "/api/docx/download?id=" + result.key(); + // 构造下载 URL — 如果配置了 gmp.download-origin 则拼上 origin,否则只返回路径 + String url = downloadOrigin.isBlank() + ? "/api/docx/download?id=" + result.key() + : downloadOrigin + "/api/docx/download?id=" + result.key(); - ExportResultData data = new ExportResultData(downloadUrl, result.fileName()); + ExportResultData data = new ExportResultData(url, result.fileName()); return ResponseEntity.ok(ApiResponse.ok(data)); } @@ -74,8 +77,6 @@ public class DocxController { .body(ApiResponse.error(404, "文件不存在或已过期: " + key)); } - // 从缓存文件名可以推断,但我们不需要 fileName,因为下载时由客户端决定。 - // 这里固定一个通用的 Content-Disposition return ResponseEntity.ok() .contentType(MediaType.parseMediaType( "application/vnd.openxmlformats-officedocument.wordprocessingml.document")) @@ -83,14 +84,4 @@ public class DocxController { "attachment; filename=\"document.docx\"") .body(fileBytes); } - - private String getBaseUrl(HttpServletRequest request) { - String scheme = request.getScheme(); - String host = request.getServerName(); - int port = request.getServerPort(); - if ((scheme.equals("http") && port == 80) || (scheme.equals("https") && port == 443)) { - return scheme + "://" + host; - } - return scheme + "://" + host + ":" + port; - } }