From 86df207c37502cce1b2043e1c7c0486459eef1d6 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期四, 13 三月 2025 19:58:45 +0800 Subject: [PATCH] 党员、诉求评论基础代码 --- springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/SFTPUtil.java | 376 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 376 insertions(+), 0 deletions(-) diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/SFTPUtil.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/SFTPUtil.java new file mode 100644 index 0000000..890157d --- /dev/null +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/SFTPUtil.java @@ -0,0 +1,376 @@ +package com.panzhihua.common.utlis; + +import java.io.*; +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.*; +import com.panzhihua.common.constants.FtpConstants; + +/** + * @version 1.0.0 + * @ClassName: SFTPUtil + * @Description: sftp连接工具类 + */ +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; + // 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; + } + + public SFTPUtil() { + this.userName = FtpConstants.FTPUSERNAME; + this.password = FtpConstants.FTPPASSWORD; + this.host = FtpConstants.FTPHOST; + this.port = FtpConstants.FTPPORT; + } + public static void main(String[] args) throws SftpException, IOException { +// SFTPUtil sftp = new SFTPUtil("root", "evanN7F2K5M6", "47.104.148.185", 22); + SFTPUtil sftp = new SFTPUtil("root", "Wpkl#&%!698", "172.192.3.2", 22); + sftp.login(); + File file = new File("F:\\settings.xml"); + InputStream is = new FileInputStream(file); + // 多级目录创建并上传 + sftp.uploadMore("/mnt/data/ftp/ss", "settings.xml", is); + sftp.logout(); + } + + /** + * 连接sftp服务器 + * + * @throws Exception + */ + public void login() { + try { + JSch jsch = new JSch(); + 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: {}", 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"); + } + } + } + + /** + * 递归根据路径创建文件夹 + * + * @param dirs + * 根据 / 分隔后的数组文件夹名称 + * @param tempPath + * 拼接路径 + * @param length + * 文件夹的格式 + * @param index + * 数组下标 + * @return + */ + public void mkdirDir(String[] dirs, String tempPath, int length, int index) { + // 以"/a/b/c/d"为例按"/"分隔后,第0位是"";顾下标从1开始 + index++; + if (index < length) { + // 目录不存在,则创建文件夹 + tempPath += "/" + dirs[index]; + } + try { + log.info("检测目录[" + tempPath + "]"); + sftp.cd(tempPath); + if (index < length) { + mkdirDir(dirs, tempPath, length, index); + } + } catch (SftpException ex) { + log.warn("创建目录[" + tempPath + "]"); + try { + sftp.mkdir(tempPath); + sftp.cd(tempPath); + } catch (SftpException e) { + e.printStackTrace(); + log.error("创建目录[" + tempPath + "]失败,异常信息[" + e.getMessage() + "]"); + + } + log.info("进入目录[" + tempPath + "]"); + mkdirDir(dirs, tempPath, length, index); + } + } + + /** + * 将输入流的数据上传到sftp作为文件(多层目录) + * + * @param directory + * 上传到该目录(多层目录) + * @param sftpFileName + * sftp端文件名 + * @param input + * 输入流 + * @throws SftpException + * @throws Exception + */ + public void uploadMore(String directory, String sftpFileName, InputStream input) throws SftpException { + try { + sftp.cd(directory); + } catch (SftpException e) { + // 目录不存在,则创建文件夹 + String[] dirs = directory.split("/"); + String tempPath = ""; + int index = 0; + mkdirDir(dirs, tempPath, dirs.length, index); + } + sftp.put(input, sftpFileName);// 上传文件 + } + + /** + * 将输入流的数据上传到sftp作为文件 + * + * @param directory + * 上传到该目录(单层目录) + * @param sftpFileName + * sftp端文件名 + * @param input + * 输入流 + * @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 downloadFile + * 下载的文件名 + * @return 字节数组 + * @throws SftpException + * @throws IOException + * @throws Exception + */ + public InputStream downloadInputStream(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 is; + } + + /** + * 删除文件 + * + * @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 + * 要列出的目录 + * @return + * @throws SftpException + */ + public Vector<?> listFiles(String directory) throws SftpException { + return sftp.ls(directory); + } + + /** + * 判断文件或者目录是否存在 + * + * @param path + * 目录或者文件的路径 + * @return 存在结果 + */ + public boolean isExistDir(String path) { + boolean isExist = false; + try { + SftpATTRS sftpATTRS = sftp.lstat(path); + isExist = true; + return sftpATTRS.isDir(); + } catch (Exception e) { + if (e.getMessage().toLowerCase().equals("no such file")) { + isExist = false; + } + } + return isExist; + + } +} \ No newline at end of file -- Gitblit v1.7.1