From 631ea5cad803ea62d46e3905ddd62e4c1bcab3e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Fri, 15 Mar 2024 14:03:35 +0800 Subject: [PATCH 1/3] =?UTF-8?q?SFTP=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/platform/utils/SFTPUtil.java | 291 ++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/SFTPUtil.java diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/SFTPUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/SFTPUtil.java new file mode 100644 index 00000000..62145119 --- /dev/null +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/SFTPUtil.java @@ -0,0 +1,291 @@ +package com.ruoyi.platform.utils; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.Properties; +import java.util.Vector; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; + +/** + * + * @ClassName: SFTPUtil + * @Description: sftp连接工具类 + * @date 2017年5月22日 下午11:17:21 + * @version 1.0.0 + */ +public class SFTPUtil { + private transient Logger log = LoggerFactory.getLogger(this.getClass()); + + private ChannelSftp sftp; + + private Session session; + /** FTP 登录用户名*/ + private String username; + /** FTP 登录密码*/ + private String password; + /** 私钥 */ + private String privateKey; + /** FTP 服务器地址IP地址*/ + private String host; + /** FTP 端口*/ + private int port; + + + /** + * 构造基于密码认证的sftp对象 + * @param userName + * @param password + * @param host + * @param port + */ + public SFTPUtil(String username, String password, String host, int port) { + this.username = username; + this.password = password; + this.host = host; + this.port = port; + } + + /** + * 构造基于秘钥认证的sftp对象 + * @param userName + * @param host + * @param port + * @param privateKey + */ + public SFTPUtil(String username, String host, int port, String privateKey) { + this.username = username; + this.host = host; + this.port = port; + this.privateKey = privateKey; + } + + public SFTPUtil(){} + + /** + * 连接sftp服务器 + * + * @throws Exception + */ + public void login(){ + try { + JSch jsch = new JSch(); + if (privateKey != null) { + jsch.addIdentity(privateKey);// 设置私钥 + log.info("sftp connect,path of private key file:{}" , privateKey); + } + log.info("sftp connect by host:{} username:{}",host,username); + + session = jsch.getSession(username, host, port); + log.info("Session is build"); + if (password != null) { + session.setPassword(password); + } + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + + session.setConfig(config); + session.connect(); + log.info("Session is connected"); + + Channel channel = session.openChannel("sftp"); + channel.connect(); + log.info("channel is connected"); + + sftp = (ChannelSftp) channel; + log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port)); + } catch (JSchException e) { + log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()}); + } + } + + /** + * 关闭连接 server + */ + public void logout(){ + if (sftp != null) { + if (sftp.isConnected()) { + sftp.disconnect(); + log.info("sftp is closed already"); + } + } + if (session != null) { + if (session.isConnected()) { + session.disconnect(); + log.info("sshSession is closed already"); + } + } + } + + /** + * 将输入流的数据上传到sftp作为文件 + * + * @param directory + * 上传到该目录 + * @param sftpFileName + * sftp端文件名 + * @param in + * 输入流 + * @throws SftpException + * @throws Exception + */ + public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{ + try { + sftp.cd(directory); + } catch (SftpException e) { + log.warn("directory is not exist"); + sftp.mkdir(directory); + sftp.cd(directory); + } + sftp.put(input, sftpFileName); + log.info("file:{} is upload successful" , sftpFileName); + } + + /** + * 上传单个文件 + * + * @param directory + * 上传到sftp目录 + * @param uploadFile + * 要上传的文件,包括路径 + * @throws FileNotFoundException + * @throws SftpException + * @throws Exception + */ + public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{ + File file = new File(uploadFile); + upload(directory, file.getName(), new FileInputStream(file)); + } + + /** + * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。 + * + * @param directory + * 上传到sftp目录 + * @param sftpFileName + * 文件在sftp端的命名 + * @param byteArr + * 要上传的字节数组 + * @throws SftpException + * @throws Exception + */ + public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{ + upload(directory, sftpFileName, new ByteArrayInputStream(byteArr)); + } + + /** + * 将字符串按照指定的字符编码上传到sftp + * + * @param directory + * 上传到sftp目录 + * @param sftpFileName + * 文件在sftp端的命名 + * @param dataStr + * 待上传的数据 + * @param charsetName + * sftp上的文件,按该字符编码保存 + * @throws UnsupportedEncodingException + * @throws SftpException + * @throws Exception + */ + public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{ + upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName))); + } + + /** + * 下载文件 + * + * @param directory + * 下载目录 + * @param downloadFile + * 下载的文件 + * @param saveFile + * 存在本地的路径 + * @throws SftpException + * @throws FileNotFoundException + * @throws Exception + */ + public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{ + if (directory != null && !"".equals(directory)) { + sftp.cd(directory); + } + File file = new File(saveFile); + sftp.get(downloadFile, new FileOutputStream(file)); + log.info("file:{} is download successful" , downloadFile); + } + /** + * 下载文件 + * @param directory 下载目录 + * @param downloadFile 下载的文件名 + * @return 字节数组 + * @throws SftpException + * @throws IOException + * @throws Exception + */ + public byte[] download(String directory, String downloadFile) throws SftpException, IOException{ + if (directory != null && !"".equals(directory)) { + sftp.cd(directory); + } + InputStream is = sftp.get(downloadFile); + + byte[] fileData = IOUtils.toByteArray(is); + + log.info("file:{} is download successful" , downloadFile); + return fileData; + } + + /** + * 删除文件 + * + * @param directory + * 要删除文件所在目录 + * @param deleteFile + * 要删除的文件 + * @throws SftpException + * @throws Exception + */ + public void delete(String directory, String deleteFile) throws SftpException{ + sftp.cd(directory); + sftp.rm(deleteFile); + } + + /** + * 列出目录下的文件 + * + * @param directory + * 要列出的目录 + * @param sftp + * @return + * @throws SftpException + */ + public Vector listFiles(String directory) throws SftpException { + return sftp.ls(directory); + } + + public static void main(String[] args) throws SftpException, IOException { + SFTPUtil sftp = new SFTPUtil("lanhuigu", "123456", "192.168.200.12", 22); + sftp.login(); + //byte[] buff = sftp.download("/opt", "start.sh"); + //System.out.println(Arrays.toString(buff)); + File file = new File("D:\\upload\\index.html"); + InputStream is = new FileInputStream(file); + + sftp.upload("/data/work", "test_sftp_upload.csv", is); + sftp.logout(); + } +} \ No newline at end of file From 8dadf1ced466ec6b6c21df4f6862b740ffb42ed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Fri, 15 Mar 2024 17:22:47 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=B5=84=E4=BA=A7=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E6=A8=A1=E7=B3=8A=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/DatasetVersionController.java | 2 +- .../controller/icon/AssetIconController.java | 16 ++++++++++++++-- .../controller/image/ImageController.java | 3 ++- .../com/ruoyi/platform/mapper/AssetIconDao.java | 2 ++ .../ruoyi/platform/service/AssetIconService.java | 4 ++++ .../service/impl/AssetIconServiceImpl.java | 6 ++++++ .../platform/service/impl/ImageServiceImpl.java | 2 ++ .../managementPlatform/AssetIconDaoMapper.xml | 13 +++++++++++++ 8 files changed, 44 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java index 6caf3600..3857c25e 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetVersionController.java @@ -62,7 +62,7 @@ public class DatasetVersionController { * @return 匹配的数据集版本记录列表 */ @GetMapping("/versions") - @ApiOperation("通过数据集id和version查询版本列表") + @ApiOperation("通过数据集id和version查询版本文件列表") public AjaxResult queryByDatasetIdAndVersion(@RequestParam("dataset_id") Integer datasetId, @RequestParam("version") String version) { return AjaxResult.success(this.datasetVersionService.queryByDatasetIdAndVersion(datasetId, version)); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java index 2115a005..cf362cce 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/icon/AssetIconController.java @@ -41,7 +41,7 @@ public class AssetIconController { @ApiOperation("分页查询") public AjaxResult queryByPage(AssetIcon assetIcon, int page, int size) { PageRequest pageRequest = PageRequest.of(page,size); - return AjaxResult.success(this.assetIconService.queryByPage(assetIcon, pageRequest)); + return AjaxResult.success(this.assetIconService.queryByPage(assetIcon, pageRequest)); } /** @@ -56,6 +56,18 @@ public class AssetIconController { return AjaxResult.success(this.assetIconService.queryById(id)); } + /** + * 按图标名字模糊查询 + * + * @param name 筛选条件 + * @return 查询结果 + */ + @GetMapping("name/{name}") + @ApiOperation("按名字模糊查询图标名字") + public AjaxResult queryByName(@PathVariable("name") String name) { + return AjaxResult.success(this.assetIconService.queryByName(name)); + } + /** * 新增数据 * @@ -75,7 +87,7 @@ public class AssetIconController { * @return 编辑结果 */ @PutMapping - @ApiOperation("更新") + @ApiOperation("更新图标") public AjaxResult edit(@RequestBody AssetIcon assetIcon) { return AjaxResult.success(this.assetIconService.update(assetIcon)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java index 2cb22868..67f132f8 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java @@ -126,6 +126,8 @@ public class ImageController { return AjaxResult.success(this.imageService.createImageFromLocal(imageName,imageTag,imageDescription)); } + + /** * 镜像上传 * @@ -133,7 +135,6 @@ public class ImageController { * @param files 文件 * @return 上传结果 */ - @PostMapping("/upload") @ApiOperation(value = "上传镜像文件", notes = "上传镜像tar包,返回存储路径") public AjaxResult uploadImageFiles(@RequestParam("files") MultipartFile[] files) throws Exception { diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/AssetIconDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/AssetIconDao.java index 4f6d8e9e..9aecbe97 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/AssetIconDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/AssetIconDao.java @@ -79,5 +79,7 @@ public interface AssetIconDao { */ int deleteById(Integer id); + List queryByName(String name); + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java index 21a43b47..18d14e8f 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AssetIconService.java @@ -4,6 +4,8 @@ import com.ruoyi.platform.domain.AssetIcon; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import java.util.List; + /** * (AssetIcon)表服务接口 * @@ -55,4 +57,6 @@ public interface AssetIconService { String removeById(Integer id); + List queryByName(String name); + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java index f342c243..f249a5a9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AssetIconServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.data.domain.PageRequest; import javax.annotation.Resource; import java.util.Date; +import java.util.List; /** * (AssetIcon)表服务实现类 @@ -114,4 +115,9 @@ public class AssetIconServiceImpl implements AssetIconService { assetIcon.setState(0); return this.assetIconDao.update(assetIcon)>0?"删除成功":"删除失败"; } + + @Override + public List queryByName(String name) { + return this.assetIconDao.queryByName(name); + } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java index 1d3c4ce4..3a05b5f4 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ImageServiceImpl.java @@ -183,6 +183,8 @@ public class ImageServiceImpl implements ImageService { // Map results = new HashMap(); // // // 验证模型是否存在 + + // Models models = this.modelsDao.queryById(id); // if (models == null) { // throw new Exception("未找到模型记录"); diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/AssetIconDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/AssetIconDaoMapper.xml index 42f36db8..eeda2a35 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/AssetIconDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/AssetIconDaoMapper.xml @@ -23,6 +23,19 @@ where id = #{id} and state = 1 + + + + +