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