From b4a4e0fe58cd5c8c4a502197e33a6355608636f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=B2=E5=85=88=E7=94=9F?= <821039958@qq.com> Date: Thu, 24 Jul 2025 15:03:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docker/api/DockerImageController.java | 34 ++++++++++- .../execute/docker/dao/DockerImageDao.java | 10 +++ .../convert/DockerImageConvert.java | 20 ++++++ .../docker/dataobject/dto/DockerImageDo.java | 61 +++++++++++++++++++ .../docker/dataobject/model/DockerImage.java | 54 ++++++++++++++++ .../dataobject/vo/DockerImagePageReqVO.java | 14 +++++ .../execute/docker/service/IImageService.java | 7 +++ .../docker/service/impl/ImageService.java | 25 +++++++- 8 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dao/DockerImageDao.java create mode 100644 modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/convert/DockerImageConvert.java create mode 100644 modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/dto/DockerImageDo.java create mode 100644 modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/model/DockerImage.java create mode 100644 modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/vo/DockerImagePageReqVO.java diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java index 290ad6b7..6c2e43e3 100644 --- a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java @@ -1,9 +1,20 @@ package cd.casic.module.execute.docker.api; +import cd.casic.framework.commons.pojo.CommonResult; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import cd.casic.module.execute.docker.dataobject.vo.DockerImagePageReqVO; +import cd.casic.module.execute.docker.service.IImageService; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import static cd.casic.framework.commons.pojo.CommonResult.success; /** * @description: TODO @@ -14,7 +25,26 @@ import org.springframework.web.bind.annotation.RestController; @Tag(name = "docker管理 - 镜像管理") @RequiredArgsConstructor @RestController +@Validated @RequestMapping("/api/images") public class DockerImageController { + + @Resource + private IImageService imageService; + + @PostMapping("/localUpload") + @Operation(summary = "镜像上传") + @PreAuthorize("@ss.hasPermission('docker:images:localUpload')") + public CommonResult localImageUpload(@RequestBody DockerImage dockerImage) { + return success(imageService.localImageUpload(dockerImage)); + } + + @GetMapping("/page") + @Operation(summary = "本地镜像分页") + @PreAuthorize("@ss.hasPermission('docker:images:query')") + public CommonResult> getLocalImagePage(@Valid DockerImagePageReqVO pageVO) { + return success(imageService.getLocalImagePage(pageVO)); + } + } diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dao/DockerImageDao.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dao/DockerImageDao.java new file mode 100644 index 00000000..8e1ca9bd --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dao/DockerImageDao.java @@ -0,0 +1,10 @@ +package cd.casic.module.execute.docker.dao; + +import cd.casic.framework.mybatis.core.mapper.BaseMapperX; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import org.apache.ibatis.annotations.Mapper; + + +@Mapper +public interface DockerImageDao extends BaseMapperX { +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/convert/DockerImageConvert.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/convert/DockerImageConvert.java new file mode 100644 index 00000000..ee288638 --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/convert/DockerImageConvert.java @@ -0,0 +1,20 @@ +package cd.casic.module.execute.docker.dataobject.convert; + +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author Yuru Pu + * @version 1.0 + * @since 2025/7/23 17:16 + */ +@Mapper(componentModel = "spring") +public interface DockerImageConvert { + DockerImageConvert INSTANCE = Mappers.getMapper(DockerImageConvert.class); + + DockerImageDo convert(DockerImage dockerImage); + +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/dto/DockerImageDo.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/dto/DockerImageDo.java new file mode 100644 index 00000000..093a0a9b --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/dto/DockerImageDo.java @@ -0,0 +1,61 @@ +package cd.casic.module.execute.docker.dataobject.dto; + +import cd.casic.framework.commons.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 本地镜像 + * + * @author Yuru Pu + * @version 1.0 + * @since 2025/7/23 16:22 + */ +@TableName("pipeline_image") +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class DockerImageDo extends BaseDO { + + @TableId(type = IdType.ASSIGN_ID) + private String id; + + private String name; + + /** + * 文件大小 + */ + private Integer size; + + /** + * 文件版本 + */ + private String version; + + /** + * 用途 + */ + private String purpose; + + /** + * 地址路径 + */ + private String path; + + /** + * 描述 + */ + private String description; + + /** + * 状态 0 可用 + */ + private Boolean state; + + + +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/model/DockerImage.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/model/DockerImage.java new file mode 100644 index 00000000..02363a2c --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/model/DockerImage.java @@ -0,0 +1,54 @@ +package cd.casic.module.execute.docker.dataobject.model; + +import cd.casic.framework.commons.dataobject.BaseDO; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 本地镜像 + * + * @author Yuru Pu + * @version 1.0 + * @since 2025/7/23 16:22 + */ +@Data +@Accessors(chain = true) +public class DockerImage extends BaseDO { + + private String id; + + private String name; + + /** + * 文件大小 + */ + private Integer size; + + /** + * 文件版本 + */ + private String version; + + /** + * 用途 + */ + private String purpose; + + /** + * 地址路径 + */ + private String path; + + /** + * 描述 + */ + private String description; + + /** + * 状态 1 可用 + */ + private Boolean state; + + + +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/vo/DockerImagePageReqVO.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/vo/DockerImagePageReqVO.java new file mode 100644 index 00000000..eca8cf78 --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/vo/DockerImagePageReqVO.java @@ -0,0 +1,14 @@ +package cd.casic.module.execute.docker.dataobject.vo; + +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +/** + * @author: Paul + * @create: 2025-07-24 13:49 + */ +@Data +public class DockerImagePageReqVO extends PageParam { + + private String name; +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java index e6c774e0..3486116a 100644 --- a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java @@ -1,5 +1,9 @@ package cd.casic.module.execute.docker.service; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import cd.casic.module.execute.docker.dataobject.vo.DockerImagePageReqVO; import com.github.dockerjava.api.command.InspectImageResponse; import com.github.dockerjava.api.model.Image; import jakarta.annotation.Nonnull; @@ -102,4 +106,7 @@ public interface IImageService { */ Boolean pushImage(@Nonnull String clientId, String imageId); + int localImageUpload(DockerImage dockerImage); + + PageResult getLocalImagePage(DockerImagePageReqVO pageVO); } diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java index dd65aa15..c34d787d 100644 --- a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java @@ -1,6 +1,13 @@ package cd.casic.module.execute.docker.service.impl; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.framework.mybatis.core.query.LambdaQueryWrapperX; import cd.casic.module.execute.docker.DockerClientFactory; +import cd.casic.module.execute.docker.dao.DockerImageDao; +import cd.casic.module.execute.docker.dataobject.convert.DockerImageConvert; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import cd.casic.module.execute.docker.dataobject.vo.DockerImagePageReqVO; import cd.casic.module.execute.docker.service.IImageService; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; @@ -11,11 +18,12 @@ import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.api.model.PruneType; import jakarta.annotation.Nonnull; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; - +import org.springframework.transaction.annotation.Transactional; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -35,6 +43,9 @@ public class ImageService implements IImageService { private final DockerClientFactory dockerClientFactory; + @Resource + private DockerImageDao dockerImageDao; + @Override public List list(@Nonnull String clientId) { DockerClient dockerClient = dockerClientFactory.getdockerClient(clientId); @@ -130,4 +141,16 @@ public class ImageService implements IImageService { } return true; } + @Transactional(rollbackFor = Exception.class) + @Override + public int localImageUpload(DockerImage dockerImage) { + return dockerImageDao.insert(DockerImageConvert.INSTANCE.convert(dockerImage)); + } + + @Override + public PageResult getLocalImagePage(DockerImagePageReqVO pageVO) { + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + PageResult page = dockerImageDao.selectPage(pageVO, queryWrapperX.likeIfPresent(DockerImageDo::getName, pageVO.getName()).orderByDesc(DockerImageDo::getCreateTime)); + return page; + } } From 36d342cb4aad06114377ad456da3dfd6eead9a86 Mon Sep 17 00:00:00 2001 From: HopeLi <1278288511@qq.com> Date: Thu, 24 Jul 2025 15:56:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?0724=20ljc=20=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=8E=A5=E5=8F=A3=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=9B=AE=E6=A0=87=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E4=B8=8B=E7=9A=84=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/casic/ci/api/SftpFileController.java | 34 ++----------- .../cd/casic/ci/api/TargetController.java | 7 ++- .../dto/req/target/TargetDownloadReq.java | 31 ------------ .../service/sftpFile/SftpClientUtils.java | 4 -- .../service/sftpFile/SftpFileService.java | 7 +-- .../sftpFile/impl/SftpFileServiceImpl.java | 44 ++++++++++++++--- .../service/target/TargetManagerService.java | 5 +- .../target/impl/TargetManagerServiceImpl.java | 48 +++++++++++++++---- 8 files changed, 91 insertions(+), 89 deletions(-) delete mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/target/TargetDownloadReq.java diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SftpFileController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SftpFileController.java index 50bdbb6c..6f7cdca6 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SftpFileController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SftpFileController.java @@ -1,15 +1,12 @@ package cd.casic.ci.api; import cd.casic.ci.process.process.service.sftpFile.SftpFileService; -import cd.casic.ci.process.properties.TargetFileUploadProperties; import cd.casic.framework.commons.pojo.CommonResult; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.io.File; -import java.io.IOException; import java.util.List; /** @@ -26,8 +23,6 @@ public class SftpFileController { @Resource private SftpFileService sftpFileService; - @Resource - private TargetFileUploadProperties fileUploadProperties; @PostMapping("/upload") public CommonResult uploadFile( @@ -35,14 +30,9 @@ public class SftpFileController { @RequestParam String remoteFileName, @RequestParam MultipartFile file) { - String localFilePath = saveTempFile(file); + String uploadFilePath = sftpFileService.uploadFile( - fileUploadProperties.getRemoteHost(), - fileUploadProperties.getRemotePort(), - fileUploadProperties.getUsername(), - fileUploadProperties.getPassword(), - fileUploadProperties.getSshKeyPath(), - localFilePath, remoteDir, remoteFileName); + file, remoteDir, remoteFileName); return CommonResult.success(uploadFilePath); } @@ -53,11 +43,6 @@ public class SftpFileController { HttpServletResponse response) { sftpFileService.downloadFile( - fileUploadProperties.getRemoteHost(), - fileUploadProperties.getRemotePort(), - fileUploadProperties.getUsername(), - fileUploadProperties.getPassword(), - fileUploadProperties.getSshKeyPath(), remoteFilePath, response); } @@ -68,21 +53,8 @@ public class SftpFileController { HttpServletResponse response) { sftpFileService.downloadFilesAsZip( - fileUploadProperties.getRemoteHost(), - fileUploadProperties.getRemotePort(), - fileUploadProperties.getUsername(), - fileUploadProperties.getPassword(), - fileUploadProperties.getSshKeyPath(), remoteFilePaths, zipFileName, response); } - private String saveTempFile(MultipartFile file) { - try { - File tempFile = File.createTempFile("upload-", ".tmp"); - file.transferTo(tempFile); - return tempFile.getAbsolutePath(); - } catch (IOException e) { - throw new RuntimeException("保存临时文件失败", e); - } - } + } 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 217b9c5e..ac32796a 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 @@ -20,7 +20,6 @@ import org.jetbrains.annotations.NotNull; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -134,9 +133,13 @@ public class TargetController { @PostMapping(path="/fileDownload") - public void fileDownload(@RequestBody @Valid TargetDownloadReq req, HttpServletResponse response) throws SftpUploadUtil.SftpUploadException, IOException { + public void fileDownload(@RequestBody @Valid BaseIdReq req, HttpServletResponse response){ targetManagerService.fileDownload(req,response); + } + @PostMapping(path="/zipDownload") + public void zipDownload(@RequestBody @Valid BaseIdReq req, HttpServletResponse response){ + targetManagerService.zipDownload(req,response); } @PostMapping(path = "/uploadFolder") diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/target/TargetDownloadReq.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/target/TargetDownloadReq.java deleted file mode 100644 index fad8d15f..00000000 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/target/TargetDownloadReq.java +++ /dev/null @@ -1,31 +0,0 @@ -package cd.casic.ci.process.dto.req.target; - -import lombok.Data; - -/** - * @ClassName PipelineQueryReq - * @Author hopeli - * @Date 2025/5/10 9:54 - * @Version 1.0 - */ -@Data -public class TargetDownloadReq { - - //远程服务器IP或主机名 - private String remoteHost = "175.6.27.252"; - - //远程服务器端口 (通常是 22),为 null 或 <= 0 时使用默认端口 22 - private Integer remotePort = 22; - - //远程服务器用户名 - private String username = "roots"; - - //远程服务器密码 (如果使用密码认证) - private String password = "hnidc0327cn!@#xhh"; - - //SSH Key 文件路径 (如果使用密钥认证,password 参数可以为 null) - private String sshKeyPath; - - //文件地址(包含文件名) - private String remoteFilePath; -} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpClientUtils.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpClientUtils.java index b85f7bbc..17b29e30 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpClientUtils.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sftpFile/SftpClientUtils.java @@ -156,10 +156,6 @@ public class SftpClientUtils implements AutoCloseable { } } } - - - - } public InputStream downloadFileToStream(String remoteFilePath) throws SftpException, SftpUploadUtil.SftpUploadException { 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 f08bf0b8..fc3d1d7a 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 @@ -2,6 +2,7 @@ package cd.casic.ci.process.process.service.sftpFile; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -14,9 +15,9 @@ import java.util.List; */ public interface SftpFileService{ - String uploadFile(String remoteHost, Integer remotePort, String username, String password, String sshKeyPath, String localFilePath, String remoteDir, String remoteFileName); + String uploadFile(MultipartFile file, String remoteDir, String remoteFileName); - void downloadFile(String remoteHost, Integer remotePort, String username, String password, String sshKeyPath, String remoteFilePath, HttpServletResponse response); + void downloadFile(String remoteFilePath, HttpServletResponse response); - void downloadFilesAsZip(String remoteHost, Integer remotePort, String username, String password, String sshKeyPath, List remoteFilePaths, String zipFileName, HttpServletResponse response); + void downloadFilesAsZip(List remoteFilePaths, String zipFileName, HttpServletResponse response); } 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 878ad46d..7cc25f35 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 @@ -3,11 +3,15 @@ package cd.casic.ci.process.process.service.sftpFile.impl; import cd.casic.ci.process.process.service.sftpFile.SftpClientUtils; import cd.casic.ci.process.process.service.sftpFile.SftpFileService; +import cd.casic.ci.process.properties.TargetFileUploadProperties; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; @@ -25,10 +29,18 @@ import java.util.zip.ZipOutputStream; @Slf4j public class SftpFileServiceImpl implements SftpFileService { + @Resource + private TargetFileUploadProperties fileUploadProperties; + @Override - public String uploadFile(String remoteHost, Integer remotePort, String username, String password, String sshKeyPath, String localFilePath, String remoteDir, String remoteFileName) { - try (SftpClientUtils client = new SftpClientUtils(remoteHost, remotePort, username, password, sshKeyPath)) { + public String uploadFile(MultipartFile file, String remoteDir, String remoteFileName) { + String localFilePath = saveTempFile(file); + try (SftpClientUtils client = new SftpClientUtils(fileUploadProperties.getRemoteHost(), + fileUploadProperties.getRemotePort(), + fileUploadProperties.getUsername(), + fileUploadProperties.getPassword(), + fileUploadProperties.getSshKeyPath())) { return client.uploadFile(localFilePath, remoteDir, remoteFileName); } catch (Exception e) { throw new RuntimeException("文件上传失败: " + e.getMessage(), e); @@ -36,8 +48,12 @@ public class SftpFileServiceImpl implements SftpFileService { } @Override - public void downloadFile(String remoteHost, Integer remotePort, String username, String password, String sshKeyPath, String remoteFilePath, HttpServletResponse response) { - try (SftpClientUtils client = new SftpClientUtils(remoteHost, remotePort, username, password, sshKeyPath)) { + public void downloadFile(String remoteFilePath, HttpServletResponse response) { + try (SftpClientUtils client = new SftpClientUtils(fileUploadProperties.getRemoteHost(), + fileUploadProperties.getRemotePort(), + fileUploadProperties.getUsername(), + fileUploadProperties.getPassword(), + fileUploadProperties.getSshKeyPath())) { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + new File(remoteFilePath).getName() + "\""); @@ -50,8 +66,12 @@ public class SftpFileServiceImpl implements SftpFileService { } @Override - public void downloadFilesAsZip(String remoteHost, Integer remotePort, String username, String password, String sshKeyPath, List remoteFilePaths, String zipFileName, HttpServletResponse response) { - try (SftpClientUtils client = new SftpClientUtils(remoteHost, remotePort, username, password, sshKeyPath)) { + public void downloadFilesAsZip(List remoteFilePaths, String zipFileName, HttpServletResponse response) { + try (SftpClientUtils client = new SftpClientUtils(fileUploadProperties.getRemoteHost(), + fileUploadProperties.getRemotePort(), + fileUploadProperties.getUsername(), + fileUploadProperties.getPassword(), + fileUploadProperties.getSshKeyPath())) { response.setContentType("application/zip"); response.setHeader("Content-Disposition", "attachment; filename=\"" + zipFileName + "\""); @@ -73,4 +93,16 @@ public class SftpFileServiceImpl implements SftpFileService { throw new RuntimeException("批量下载并打包 ZIP 失败: " + e.getMessage(), e); } } + + + + private String saveTempFile(MultipartFile file) { + try { + File tempFile = File.createTempFile("upload-", ".tmp"); + file.transferTo(tempFile); + return tempFile.getAbsolutePath(); + } catch (IOException e) { + throw new RuntimeException("保存临时文件失败", e); + } + } } 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 176eefbf..2c43bb54 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 @@ -12,7 +12,6 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; import java.util.List; /** @@ -41,5 +40,7 @@ public interface TargetManagerService extends IService { void updateVersion(@Valid TargetVersionUpdateReq req); - void fileDownload(@Valid TargetDownloadReq req, HttpServletResponse response) throws SftpUploadUtil.SftpUploadException, IOException; + void fileDownload(@Valid BaseIdReq req, HttpServletResponse response); + + void 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 f9390093..67de15ea 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 @@ -12,6 +12,7 @@ import cd.casic.ci.process.process.dataObject.base.BaseIdReq; import cd.casic.ci.process.process.dataObject.target.TargetManager; import cd.casic.ci.process.process.dataObject.target.TargetVersion; import cd.casic.ci.process.process.service.pipeline.PipelineService; +import cd.casic.ci.process.process.service.sftpFile.impl.SftpFileServiceImpl; import cd.casic.ci.process.process.service.target.TargetManagerService; import cd.casic.ci.process.properties.TargetFileUploadProperties; import cd.casic.ci.process.util.SftpUploadUtil; @@ -66,6 +67,9 @@ public class TargetManagerServiceImpl extends ServiceImpl wrapper = new QueryWrapper<>(); + wrapper.eq("target_id",req.getId()); + List targetVersionList = targetVersionDao.selectList(wrapper); + + if (ObjectUtils.isEmpty(targetVersionList)){ + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"目标版本不存在"); + } + + List filePathList = targetVersionList.stream().map(TargetVersion::getFilePath).toList(); + sftpFileService.downloadFilesAsZip(filePathList,targetManager.getTargetName(),response); }