赞
踩
Jsch表示Java Secure Channel。SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
jar包:
- <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
- <dependency>
- <groupId>com.jcraft</groupId>
- <artifactId>jsch</artifactId>
- <version>0.1.54</version>
- </dependency>
ChannelSftp类:
ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:
put(): 文件上传
get(): 文件下载
cd(): 进入指定目录
ls(): 得到指定目录下的文件列表
rename(): 重命名指定文件或目录
rm(): 删除指定文件
mkdir(): 创建目录
rmdir(): 删除目录
JSch支持三种文件传输模式:
OVERWRITE | 完全覆盖模式,这是JSch的默认文件传输模式,即如果目标文件已经存在,传输的文件将完全覆盖目标文件,产生新的文件。 |
RESUME | 恢复模式,如果文件已经传输一部分,这时由于网络或其他任何原因导致文件传输中断,如果下一次传输相同的文件, 则会从上一次中断的地方续传。 |
APPEND | 追加模式,如果目标文件已存在,传输的文件将在目标文件后追加。 |
实现文件上传可以调用ChannelSftp对象的put方法。ChannelSftp中有12个put方法的重载方法:
public void put(String src, String dst) | 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。 采用默认的传输模式:OVERWRITE |
public void put(String src, String dst, int mode) | 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。 指定文件传输模式为mode(mode可选值为:ChannelSftp.OVERWRITE,ChannelSftp.RESUME, ChannelSftp.APPEND) |
public void put(String src, String dst, SftpProgressMonitor monitor) | 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。 采用默认的传输模式:OVERWRITE 并使用实现了SftpProgressMonitor接口的monitor对象来监控文件传输的进度。 |
public void put(String src, String dst, | 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。 指定传输模式为mode 并使用实现了SftpProgressMonitor接口的monitor对象来监控文件传输的进度。 |
public void put(InputStream src, String dst) | 将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。 采用默认的传输模式:OVERWRITE |
public void put(InputStream src, String dst, int mode) | 将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。 指定文件传输模式为mode |
public void put(InputStream src, String dst, SftpProgressMonitor monitor) | 将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。 采用默认的传输模式:OVERWRITE 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。 |
public void put(InputStream src, String dst, | 将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。 指定文件传输模式为mode 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。 |
public OutputStream put(String dst) | 该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。 采用默认的传输模式:OVERWRITE |
public OutputStream put(String dst, final int mode) | 该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。 指定文件传输模式为mode |
public OutputStream put(String dst, final SftpProgressMonitor monitor, final int mode) | 该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。 指定文件传输模式为mode 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。 |
public OutputStream put(String dst, final SftpProgressMonitor monitor, final int mode, long offset) | 该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。 指定文件传输模式为mode 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。 offset指定了一个偏移量,从输出流偏移offset开始写入数据。 |
编写一个工具类,传入ip,用户名及密码得到一个SFTP channel对象,即ChannelSftp的实例对象,在应用程序中就可以使用该对象来调用SFTP的各种操作方法。
SFTPChannel.java
-
- import java.util.Map;
- import java.util.Properties;
-
- import org.apache.log4j.Logger;
-
- 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;
-
- public class SFTPChannel {
- Session session = null;
- Channel channel = null;
-
- private static final Logger LOG = Logger.getLogger(SFTPChannel.class.getName());
-
- public ChannelSftp getChannel(Map<String, String> sftpDetails, int timeout) throws JSchException {
-
- String ftpHost = sftpDetails.get(SFTPConstants.SFTP_REQ_HOST);
- String port = sftpDetails.get(SFTPConstants.SFTP_REQ_PORT);
- String ftpUserName = sftpDetails.get(SFTPConstants.SFTP_REQ_USERNAME);
- String ftpPassword = sftpDetails.get(SFTPConstants.SFTP_REQ_PASSWORD);
-
- int ftpPort = SFTPConstants.SFTP_DEFAULT_PORT;
- if (port != null && !port.equals("")) {
- ftpPort = Integer.valueOf(port);
- }
-
- JSch jsch = new JSch(); // 创建JSch对象
- session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名,主机ip,端口获取一个Session对象
- LOG.debug("Session created.");
- if (ftpPassword != null) {
- session.setPassword(ftpPassword); // 设置密码
- }
- Properties config = new Properties();
- config.put("StrictHostKeyChecking", "no");
- session.setConfig(config); // 为Session对象设置properties
- session.setTimeout(timeout); // 设置timeout时间
- session.connect(); // 通过Session建立链接
- LOG.debug("Session connected.");
-
- LOG.debug("Opening Channel.");
- channel = session.openChannel("sftp"); // 打开SFTP通道
- channel.connect(); // 建立SFTP通道的连接
- LOG.debug("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName
- + ", returning: " + channel);
- return (ChannelSftp) channel;
- }
-
- public void closeChannel() throws Exception {
- if (channel != null) {
- channel.disconnect();
- }
- if (session != null) {
- session.disconnect();
- }
- }
- }
SFTPConstans.java
- package com.longyg.sftp;
-
- public class SFTPConstants {
- public static final String SFTP_REQ_HOST = "host";
- public static final String SFTP_REQ_PORT = "port";
- public static final String SFTP_REQ_USERNAME = "username";
- public static final String SFTP_REQ_PASSWORD = "password";
- public static final int SFTP_DEFAULT_PORT = 22;
- public static final String SFTP_REQ_LOC = "location";
- }
-
- public void putResource(String firmwarePath,String name, byte[] data) {
- SFTPChannel channel = new SFTPChannel();
- Map<String, String> sftpDetails = new HashMap<String, String>();
- // 设置主机ip,端口,用户名,密码
- sftpDetails.put(SFTPConstants.SFTP_REQ_HOST, sshHostS);
- sftpDetails.put(SFTPConstants.SFTP_REQ_USERNAME, sshNameD);
- sftpDetails.put(SFTPConstants.SFTP_REQ_PASSWORD, sshPassD);
- sftpDetails.put(SFTPConstants.SFTP_REQ_PORT, sshPortD);
- ChannelSftp chSftp = null;
- try {
- chSftp = channel.getChannel(sftpDetails, 60000);
- chSftp.put(firmwarePath+name, firmwarePath+name, ChannelSftp.OVERWRITE);
- } catch (JSchException e) {
- logger.info("JSchException JSchException:" + e);
- } catch (Exception e) {
- logger.info("Exception Exception:" + e);
- }finally {
- chSftp.quit();
- try {
- channel.closeChannel();
- } catch (Exception e) {
- }
- }
- }
原文章参考:http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。