| @@ -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(); | |||||
| } | |||||
| } | |||||