From bdc8d6be794154a98966cf91f23fd882e774396f Mon Sep 17 00:00:00 2001
From: 张天森 <1292933220@qq.com>
Date: 星期三, 12 十月 2022 20:11:29 +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..505ec3d
--- /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);
+ 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