From b37752f4c42022c2abc9f0938ad8d2d9d45e1c39 Mon Sep 17 00:00:00 2001 From: even <827656971@qq.com> Date: Fri, 6 Jun 2025 18:10:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E5=91=8A=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/casic/ci/api/ReportController.java | 5 +- .../process/service/report/ReportService.java | 3 +- .../report/impl/ReportServiceImpl.java | 57 ++++++++++++++++++- .../test/java/cd/casic/server/ReportTest.java | 9 +++ 4 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 ops-server/src/test/java/cd/casic/server/ReportTest.java diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ReportController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ReportController.java index bc60da56..33b26d13 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ReportController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ReportController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -54,11 +55,11 @@ public class ReportController { @PostMapping(path="/downLoadReport") - public CommonResult> downLoadReport(@RequestBody @NotNull @Valid BaseIdReq req) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + public CommonResult> downLoadReport(@RequestBody @NotNull @Valid BaseIdReq req) throws Exception { ResponseEntity fileInputStream = reportService.downLoadReport(req); - return CommonResult.success(fileInputStream); + return CommonResult.success(fileInputStream); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/ReportService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/ReportService.java index cc74629a..02c4f501 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/ReportService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/ReportService.java @@ -8,6 +8,7 @@ import cd.casic.framework.commons.pojo.PageResult; import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; +import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -24,5 +25,5 @@ public interface ReportService{ ReportResp deleteReport(@Valid ReportDeleteReq req) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException; - ResponseEntity downLoadReport(@Valid BaseIdReq req) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException; + ResponseEntity downLoadReport(@Valid BaseIdReq req) throws Exception; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/impl/ReportServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/impl/ReportServiceImpl.java index 900c2921..f5cfcd16 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/impl/ReportServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/report/impl/ReportServiceImpl.java @@ -11,11 +11,18 @@ import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; import cd.casic.framework.commons.pojo.PageResult; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import jakarta.activation.MimeType; import lombok.extern.slf4j.Slf4j; +import org.apache.tika.Tika; +import org.apache.tika.metadata.Metadata; import org.springframework.http.*; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.file.Files; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -94,11 +101,12 @@ public class ReportServiceImpl implements ReportService { @Override - public ResponseEntity downLoadReport(BaseIdReq req) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + public ResponseEntity downLoadReport(BaseIdReq req) throws Exception { RestTemplate restTemplate = getRestTemplateWithoutSANCheck(); String reportDeleteUrl = ConstantContextHolder.getScaIp() + PATH; String body = buildDownloadRequestBody(req); HttpHeaders headers = createHeaders(); + restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter()); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity requestEntity = new HttpEntity<>(body, headers); @@ -111,10 +119,14 @@ public class ReportServiceImpl implements ReportService { byte[] responseBody = responseEntity.getBody(); String base64ResponseBody = Base64.getEncoder().encodeToString(responseBody); // 构建返回给前端的 ResponseEntity - + // 返回MIME类型:ml-citation{ref="5" data="citationList"} + Optional detect = detect(responseBody); + FileType fileType = detect.get(); + System.out.println(fileType.extension); + // 可选:转换为扩展名 return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=report.zip") + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=report."+fileType.extension) .body(base64ResponseBody); }else { log.error("===============报告下载接口失败================="); @@ -201,6 +213,45 @@ public class ReportServiceImpl implements ReportService { reportResp.setSuccess(data.getInteger("success")); reportResp.setXmTraceId(xmTraceId); } + public enum FileType { + // 文档类 + XLSX("xlsx", "Excel", new byte[]{0x50, 0x4B, 0x03, 0x04}), + DOCX("docx", "Word", new byte[]{0x50, 0x4B, 0x03, 0x04}), + PDF("pdf", "PDF", new byte[]{0x25, 0x50, 0x44, 0x46}), + // 图片类 + PNG("png", "PNG", new byte[]{-119, 0x50, 0x4E, 0x47}), + JPEG("jpg", "JPEG", new byte[]{-1, -40, -1, -32}), + + // 压缩包 + ZIP("zip", "ZIP", new byte[]{0x50, 0x4B, 0x03, 0x04}), + RAR("rar", "RAR", new byte[]{0x52, 0x61, 0x72, 0x21}); + + private final String extension; + private final String description; + private final byte[] magicNumber; + + FileType(String ext, String desc, byte[] magic) { + this.extension = ext; + this.description = desc; + this.magicNumber = magic; + } + } + + public static Optional detect(byte[] header) throws Exception { + for (FileType type : FileType.values()) { + if (header.length >= type.magicNumber.length) { + boolean match = true; + for (int i = 0; i < type.magicNumber.length; i++) { + if (header[i] != type.magicNumber[i]) { + match = false; + break; + } + } + if (match) return Optional.of(type); + } + } + return Optional.empty(); + } } diff --git a/ops-server/src/test/java/cd/casic/server/ReportTest.java b/ops-server/src/test/java/cd/casic/server/ReportTest.java new file mode 100644 index 00000000..84042fef --- /dev/null +++ b/ops-server/src/test/java/cd/casic/server/ReportTest.java @@ -0,0 +1,9 @@ +package cd.casic.server; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(classes = {OpsServerApplication.class}) +@ActiveProfiles("local") +public class ReportTest { +}