diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TargetController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TargetController.java index ac32796a..8f6f057a 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TargetController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TargetController.java @@ -2,6 +2,7 @@ package cd.casic.ci.api; import cd.casic.ci.process.dto.req.target.*; +import cd.casic.ci.process.dto.resp.sftpFile.FileBase64DownloadResp; import cd.casic.ci.process.dto.resp.target.TargetManagerResp; import cd.casic.ci.process.dto.resp.target.TargetVersionResp; import cd.casic.ci.process.process.dataObject.base.BaseIdReq; @@ -138,8 +139,8 @@ public class TargetController { } @PostMapping(path="/zipDownload") - public void zipDownload(@RequestBody @Valid BaseIdReq req, HttpServletResponse response){ - targetManagerService.zipDownload(req,response); + public CommonResult zipDownload(@RequestBody @Valid BaseIdReq req, HttpServletResponse response){ + return CommonResult.success(targetManagerService.zipDownload(req, response)); } @PostMapping(path = "/uploadFolder") diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TestCaseManagerController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TestCaseManagerController.java index 7c2ba034..13aac1c5 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TestCaseManagerController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TestCaseManagerController.java @@ -3,21 +3,17 @@ package cd.casic.ci.api; import cd.casic.ci.process.dto.req.testCase.TestCaseManagerQueryReq; import cd.casic.ci.process.dto.req.testCase.TestCaseManagerReq; -import cd.casic.ci.process.dto.resp.testCase.TestCaseManagerDownloadResp; +import cd.casic.ci.process.dto.resp.sftpFile.FileBase64DownloadResp; import cd.casic.ci.process.dto.resp.testCase.TestCaseManagerResp; import cd.casic.ci.process.process.dataObject.base.BaseIdReq; import cd.casic.ci.process.process.service.testCase.TestCaseManagerService; import cd.casic.framework.commons.pojo.CommonResult; import cd.casic.framework.commons.pojo.PageResult; -import com.jcraft.jsch.JSchException; -import com.jcraft.jsch.SftpException; import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.jetbrains.annotations.NotNull; import org.springframework.web.bind.annotation.*; -import java.io.IOException; import java.util.List; /** @@ -86,7 +82,7 @@ public class TestCaseManagerController { return CommonResult.success(resp); } @GetMapping("/downLoadById") - public CommonResult downLoadByManagerId(@RequestParam String managerId){ + public CommonResult downLoadByManagerId(@RequestParam String managerId){ return CommonResult.success(testCaseManagerService.downLoadById(managerId)); } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sftpFile/FileBase64DownloadResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sftpFile/FileBase64DownloadResp.java new file mode 100644 index 00000000..61395950 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sftpFile/FileBase64DownloadResp.java @@ -0,0 +1,9 @@ +package cd.casic.ci.process.dto.resp.sftpFile; + +import lombok.Data; + +@Data +public class FileBase64DownloadResp { + private String fileName; + private String file; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/testCase/TestCaseManagerDownloadResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/testCase/TestCaseManagerDownloadResp.java deleted file mode 100644 index 8e536cef..00000000 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/testCase/TestCaseManagerDownloadResp.java +++ /dev/null @@ -1,9 +0,0 @@ -package cd.casic.ci.process.dto.resp.testCase; - -import lombok.Data; - -@Data -public class TestCaseManagerDownloadResp { - private String fileName; - private String file; -} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpFileService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpFileService.java index fc3d1d7a..ce321567 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpFileService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpFileService.java @@ -4,6 +4,7 @@ package cd.casic.ci.process.process.service.sftpFile; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; +import java.io.OutputStream; import java.util.List; /** @@ -20,4 +21,5 @@ public interface SftpFileService{ void downloadFile(String remoteFilePath, HttpServletResponse response); void downloadFilesAsZip(List remoteFilePaths, String zipFileName, HttpServletResponse response); + public void downloadFilesAsZip(List remoteFilePaths, OutputStream outputStream); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/impl/SftpFileServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/impl/SftpFileServiceImpl.java index 7cc25f35..0b8164a9 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/impl/SftpFileServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/impl/SftpFileServiceImpl.java @@ -94,7 +94,32 @@ public class SftpFileServiceImpl implements SftpFileService { } } + @Override + public void downloadFilesAsZip(List remoteFilePaths, OutputStream outputStream) { + try (SftpClientUtils client = new SftpClientUtils(fileUploadProperties.getRemoteHost(), + fileUploadProperties.getRemotePort(), + fileUploadProperties.getUsername(), + fileUploadProperties.getPassword(), + fileUploadProperties.getSshKeyPath())) { + try (ZipOutputStream zipOut = new ZipOutputStream(outputStream)) { + for (String remoteFilePath : remoteFilePaths) { + String fileName = remoteFilePath.substring(remoteFilePath.lastIndexOf("/") + 1); + try (InputStream in = client.downloadFileToStream(remoteFilePath)) { + zipOut.putNextEntry(new ZipEntry(fileName)); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = in.read(buffer)) > 0) { + zipOut.write(buffer, 0, bytesRead); + } + zipOut.closeEntry(); + } + } + } + } catch (Exception e) { + throw new RuntimeException("批量下载并打包 ZIP 失败: " + e.getMessage(), e); + } + } private String saveTempFile(MultipartFile file) { try { diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/TargetManagerService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/TargetManagerService.java index 2c43bb54..c723fa36 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/TargetManagerService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/TargetManagerService.java @@ -2,6 +2,7 @@ package cd.casic.ci.process.process.service.target; import cd.casic.ci.process.dto.req.target.*; +import cd.casic.ci.process.dto.resp.sftpFile.FileBase64DownloadResp; import cd.casic.ci.process.dto.resp.target.TargetManagerResp; import cd.casic.ci.process.process.dataObject.base.BaseIdReq; import cd.casic.ci.process.process.dataObject.target.TargetManager; @@ -42,5 +43,5 @@ public interface TargetManagerService extends IService { void fileDownload(@Valid BaseIdReq req, HttpServletResponse response); - void zipDownload(@Valid BaseIdReq req, HttpServletResponse response); + FileBase64DownloadResp zipDownload(@Valid BaseIdReq req, HttpServletResponse response); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/impl/TargetManagerServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/impl/TargetManagerServiceImpl.java index 67de15ea..eca83df6 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/impl/TargetManagerServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/target/impl/TargetManagerServiceImpl.java @@ -2,6 +2,7 @@ package cd.casic.ci.process.process.service.target.impl; import cd.casic.ci.process.dto.req.target.*; +import cd.casic.ci.process.dto.resp.sftpFile.FileBase64DownloadResp; import cd.casic.ci.process.dto.resp.target.TargetManagerResp; import cd.casic.ci.process.dto.resp.target.TargetVersionResp; import cd.casic.ci.process.process.converter.TargetConverter; @@ -37,10 +38,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; +import java.util.*; /** * @author HopeLi @@ -296,7 +294,7 @@ public class TargetManagerServiceImpl extends ServiceImpl filePathList = targetVersionList.stream().map(TargetVersion::getFilePath).toList(); - sftpFileService.downloadFilesAsZip(filePathList,targetManager.getTargetName(),response); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + String targetName = targetManager.getTargetName(); + sftpFileService.downloadFilesAsZip(filePathList,bos); + byte[] byteArray = bos.toByteArray(); + String file = Base64.getEncoder().encodeToString(byteArray); + FileBase64DownloadResp resp = new FileBase64DownloadResp(); + resp.setFile(file); + resp.setFileName(targetName); + return resp; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseManagerService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseManagerService.java index cb9bdaad..c02078e0 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseManagerService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseManagerService.java @@ -3,17 +3,13 @@ package cd.casic.ci.process.process.service.testCase; import cd.casic.ci.process.dto.req.testCase.TestCaseManagerQueryReq; import cd.casic.ci.process.dto.req.testCase.TestCaseManagerReq; -import cd.casic.ci.process.dto.resp.testCase.TestCaseManagerDownloadResp; +import cd.casic.ci.process.dto.resp.sftpFile.FileBase64DownloadResp; import cd.casic.ci.process.dto.resp.testCase.TestCaseManagerResp; import cd.casic.ci.process.process.dataObject.testCase.TestCaseManager; import cd.casic.framework.commons.pojo.PageResult; import com.baomidou.mybatisplus.extension.service.IService; -import com.jcraft.jsch.JSchException; -import com.jcraft.jsch.SftpException; -import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; -import java.io.IOException; import java.util.List; /** @@ -37,6 +33,6 @@ public interface TestCaseManagerService extends IService { TestCaseManagerResp findById(String id); - TestCaseManagerDownloadResp downLoadById(String id ); + FileBase64DownloadResp downLoadById(String id ); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java index c193169b..124bd748 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java @@ -4,7 +4,7 @@ package cd.casic.ci.process.process.service.testCase.impl; import cd.casic.ci.process.dto.req.testCase.TestCaseManagerQueryReq; import cd.casic.ci.process.dto.req.testCase.TestCaseManagerReq; import cd.casic.ci.process.dto.resp.testCase.TestCaseInfoResp; -import cd.casic.ci.process.dto.resp.testCase.TestCaseManagerDownloadResp; +import cd.casic.ci.process.dto.resp.sftpFile.FileBase64DownloadResp; import cd.casic.ci.process.dto.resp.testCase.TestCaseManagerResp; import cd.casic.ci.process.process.converter.TestCaseManagerConverter; import cd.casic.ci.process.process.dao.testCase.TestCaseInfoDao; @@ -26,7 +26,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jcraft.jsch.*; import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -151,7 +150,7 @@ public class TestCaseManagerServiceImpl extends ServiceImpl