SFTP和Channel 您所在的位置:网站首页 会话连接到传输连接的映射怎么办 SFTP和Channel

SFTP和Channel

2024-07-15 08:09| 来源: 网络整理| 查看: 265

SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP为SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

1.实现依赖Jsch-0.1.54.jar

可以在mvn repository 依赖到项目来,我使用的依赖如下:

com.jcraft jsch 0.1.54 2.引入Jar包之后,我们就先可配置化我们SFTP的一些参数

新建 config.properties

work order photo SFTP config.

sftp.ip=10.32.233.111 sftp.port=22 sftp.userName=root sftp.password=kaifa123 sftp.timeout=60000 sftp.src=D:\ftpLocalFile sftp.dst= /opt/soft/sftp/ sftp.retryTime=3 @see ConfigEntity#getSftpXXX() 方法将从config.properties文件读取相应配置信息

3.封装创建获得SFTP服务器的连接的方法及释放连接的方法

解释一下SFTP的整个调用过程,这个过程就是通过Ip、Port、Username、Password获取一个Session,然后通过Session打开SFTP通道(获得SFTP Channel对象),再在建立通道(Channel)连接,最后我们就是通过这个Channel对象来调用SFTP的各种操作方法.总是要记得,我们操作完SFTP需要手动断开Channel连接与Session连接。

直接贴相应的方法代码: /** * 获得SFTP Channel * @return ChannelSftp Instance * @throws JSchException */ public ChannelSftp getChannel() throws JSchException { String ftpHost = config.getSftpIp(); int ftpPort = config.getSftpPort(); String ftpUserName = config.getSftpUserName(); String ftpPassword = config.getSftpPassword(); // 创建JSch对象 JSch jsch = new JSch(); // 根据用户名,主机ip,端口获取一个Session对象 session = jsch.getSession(ftpUserName, ftpHost, ftpPort); //logger.info("Session created."); if (ftpPassword != null) { // 设置密码 session.setPassword(ftpPassword); } Properties configTemp = new Properties(); configTemp.put("StrictHostKeyChecking", "no"); // 为Session对象设置properties session.setConfig(configTemp); // 设置timeout时间 session.setTimeout(config.getSftpTimeout()); session.connect(); // 通过Session建立链接 // 打开SFTP通道 channel = session.openChannel("sftp"); // 建立SFTP通道的连接 channel.connect(); logger.info("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName + ", returning: " + channel); return (ChannelSftp) channel; } /** * 断开SFTP Channel、Session连接 * @throws Exception */ public void closeChannel() throws Exception { if (channel != null) { channel.disconnect(); } if (session != null) { session.disconnect(); } logger.info("disconnected SFTP successfully!"); } @Autowired private ConfigEntity config; //Ignore this 4.调用代码示例 ChannelSftp chSftp = getChannel(); // 本地文件名 String src = config.getSftpLocalPath() + orderPhoto.getNewPhotoName(); // 目标文件名 String dst = config.getSftpDstPath() + orderPhoto.getNewPhotoName(); chSftp.put(src, dst, ChannelSftp.OVERWRITE); chSftp.quit(); closeChannel(); Jsch-0.1.54.jar 学习了解

ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如: 文件上传put(),文件下载get(),进入指定目录cd(). 得到指定目录下的文件列表ls(). 重命名指定文件或目录rename(). 删除指定文件rm(),创建目录mkdir(),删除目录rmdir(). 大家引用方法时可以快速参考一下,具体传参需参考源码~

最后还要提一下的就是JSch支持的三种文件传输模式:

APPEND 追加模式,如果目标文件已存在,传输的文件将在目标文件后追加。 RESUME 恢复模式,如果文件已经传输一部分,这时由于网络或其他任何原因导致文件传输中断,如果下一次传输相同的文件,则会从上一次中断的地方续传。 OVERWRITE 完全覆盖模式,这是JSch的默认文件传输模式,即如果目标文件已经存在,传输的文件将完全覆盖目标文件,产生新的文件。 ——–End Learning———- 二、Java实现FTP文件上传(一般是Windows使用) 直接上代码 /** * 连接到服务器 * @return true 连接服务器成功,false 连接服务器失败 */ public boolean connectServer() { boolean flag = true; if (ftpClient == null) { int reply; try { if(true){ ftpClient = new FTPClient(); ftpClient.connect(config.getFtpIp(),config.getFtpPort()); ftpClient.login(config.getFtpUserName(), config.getFtpPassword()); reply = ftpClient.getReplyCode(); ftpClient.setDataTimeout(60000); if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); logger.info("FTP server refuse connect!"); flag = false; } }else{ flag = false; } } catch (SocketException e) { flag = false; e.printStackTrace(); logger.info("Login ftp server " + config.getFtpIp() + " failed,connect timeout!"); logger.error("Login ftp server " + config.getFtpIp() + " failed",e); } catch (IOException e) { flag = false; e.printStackTrace(); logger.info("Login ftp server " + config.getFtpIp() + " failed,FTP server couldn't open!"); logger.error("Login ftp server " + config.getFtpIp() + " failed",e); } } return flag; } public boolean disConnectServer() { boolean flag = true; if (ftpClient != null) { try{ ftpClient.logout(); ftpClient.disconnect(); }catch (Exception e){ flag = false; logger.info("Disconnect ftp server " + config.getFtpIp() + " failed!"); logger.error("Disconnect ftp server " + config.getFtpIp() + " failed",e); } } return flag; } /** * @param remoteFile * @param localFile * @return * @throws IOException */ public boolean uploadFile(String remoteFile, File localFile) throws IOException { boolean flag = false; /* File file = new File("D://"+UUID.randomUUID()+".jpg"); if (!file.exists()) { file.createNewFile(); }*/ InputStream in = new FileInputStream(localFile); // IOUtils.copy(in,new FileOutputStream(file)); //String remote = new String(remoteFile.getBytes("GBK"),"iso-8859-1"); /*ftpClient.setBufferSize(1024*1024); ftpClient.setControlEncoding("utf-8"); ftpClient.enterLocalPassiveMode();*/ ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.changeWorkingDirectory("/picture/pp"); if (ftpClient.storeFile(remoteFile, in)) { flag = true; logger.info(localFile.getAbsolutePath() + "upload successfully!"); } else { logger.info(localFile.getAbsolutePath() + "upload failed!"); } in.close(); return flag; } /** * 上传单个文件,并重命名 * @param local --本地文件路径 * @param remote --本地文件父文件夹路径 * @return true 上传成功,false 上传失败 * @throws IOException */ public boolean uploadFile(String local, String remote) throws IOException { boolean flag = true; String remoteFileName = remote; File f = new File(local); if (!uploadFile(remoteFileName, f)) { flag = false; } return flag; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有