feat: configurable download origin (gmp.download-origin), defaults to path-only

This commit is contained in:
agentuser
2026-05-11 17:13:01 +08:00
parent da415aab80
commit 38b9b64809
@@ -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<ApiResponse<ExportResultData>> 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;
}
}