当前位置:   article > 正文

Jsch - Java实现的SFTP文件上传_jsch 上传限速

jsch 上传限速

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

jar包:

  1. <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
  2. <dependency>
  3. <groupId>com.jcraft</groupId>
  4. <artifactId>jsch</artifactId>
  5. <version>0.1.54</version>
  6. </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,
SftpProgressMonitor monitor, int mode)

将本地文件名为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,
SftpProgressMonitor monitor, int mode)

将本地的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开始写入数据。

创建ChannelSftp对象:

编写一个工具类,传入ip,用户名及密码得到一个SFTP channel对象,即ChannelSftp的实例对象,在应用程序中就可以使用该对象来调用SFTP的各种操作方法。

SFTPChannel.java

  1. import java.util.Map;
  2. import java.util.Properties;
  3. import org.apache.log4j.Logger;
  4. import com.jcraft.jsch.Channel;
  5. import com.jcraft.jsch.ChannelSftp;
  6. import com.jcraft.jsch.JSch;
  7. import com.jcraft.jsch.JSchException;
  8. import com.jcraft.jsch.Session;
  9. public class SFTPChannel {
  10. Session session = null;
  11. Channel channel = null;
  12. private static final Logger LOG = Logger.getLogger(SFTPChannel.class.getName());
  13. public ChannelSftp getChannel(Map<String, String> sftpDetails, int timeout) throws JSchException {
  14. String ftpHost = sftpDetails.get(SFTPConstants.SFTP_REQ_HOST);
  15. String port = sftpDetails.get(SFTPConstants.SFTP_REQ_PORT);
  16. String ftpUserName = sftpDetails.get(SFTPConstants.SFTP_REQ_USERNAME);
  17. String ftpPassword = sftpDetails.get(SFTPConstants.SFTP_REQ_PASSWORD);
  18. int ftpPort = SFTPConstants.SFTP_DEFAULT_PORT;
  19. if (port != null && !port.equals("")) {
  20. ftpPort = Integer.valueOf(port);
  21. }
  22. JSch jsch = new JSch(); // 创建JSch对象
  23. session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名,主机ip,端口获取一个Session对象
  24. LOG.debug("Session created.");
  25. if (ftpPassword != null) {
  26. session.setPassword(ftpPassword); // 设置密码
  27. }
  28. Properties config = new Properties();
  29. config.put("StrictHostKeyChecking", "no");
  30. session.setConfig(config); // 为Session对象设置properties
  31. session.setTimeout(timeout); // 设置timeout时间
  32. session.connect(); // 通过Session建立链接
  33. LOG.debug("Session connected.");
  34. LOG.debug("Opening Channel.");
  35. channel = session.openChannel("sftp"); // 打开SFTP通道
  36. channel.connect(); // 建立SFTP通道的连接
  37. LOG.debug("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName
  38. + ", returning: " + channel);
  39. return (ChannelSftp) channel;
  40. }
  41. public void closeChannel() throws Exception {
  42. if (channel != null) {
  43. channel.disconnect();
  44. }
  45. if (session != null) {
  46. session.disconnect();
  47. }
  48. }
  49. }

SFTPConstants:

SFTPConstans.java

  1. package com.longyg.sftp;
  2. public class SFTPConstants {
  3. public static final String SFTP_REQ_HOST = "host";
  4. public static final String SFTP_REQ_PORT = "port";
  5. public static final String SFTP_REQ_USERNAME = "username";
  6. public static final String SFTP_REQ_PASSWORD = "password";
  7. public static final int SFTP_DEFAULT_PORT = 22;
  8. public static final String SFTP_REQ_LOC = "location";
  9. }

简单实例方法:

  1. public void putResource(String firmwarePath,String name, byte[] data) {
  2. SFTPChannel channel = new SFTPChannel();
  3. Map<String, String> sftpDetails = new HashMap<String, String>();
  4. // 设置主机ip,端口,用户名,密码
  5. sftpDetails.put(SFTPConstants.SFTP_REQ_HOST, sshHostS);
  6. sftpDetails.put(SFTPConstants.SFTP_REQ_USERNAME, sshNameD);
  7. sftpDetails.put(SFTPConstants.SFTP_REQ_PASSWORD, sshPassD);
  8. sftpDetails.put(SFTPConstants.SFTP_REQ_PORT, sshPortD);
  9. ChannelSftp chSftp = null;
  10. try {
  11. chSftp = channel.getChannel(sftpDetails, 60000);
  12. chSftp.put(firmwarePath+name, firmwarePath+name, ChannelSftp.OVERWRITE);
  13. } catch (JSchException e) {
  14. logger.info("JSchException JSchException:" + e);
  15. } catch (Exception e) {
  16. logger.info("Exception Exception:" + e);
  17. }finally {
  18. chSftp.quit();
  19. try {
  20. channel.closeChannel();
  21. } catch (Exception e) {
  22. }
  23. }
  24. }

 

Jsch支持在文件传输时对传输进度的监控。可以实现JSch提供的SftpProgressMonitor接口来完成这个功能。由于业务不需要,此处省略,继续学习可以参考原文章。

 原文章参考:http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/873360
推荐阅读
相关标签
  

闽ICP备14008679号