使用jsch实现SFTP文件传输

分手后的思念是犯贱 2022-05-27 00:44 563阅读 0赞

1、环境搭建
这里使用maven管理项目,所以第一步需要先导入相关的依赖,第一步:安装vsftpd提供ftp服务(注意跟xftp不同,协议与端口都不同)

  1. <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
  2. <dependency>
  3. <groupId>com.jcraft</groupId>
  4. <artifactId>jsch</artifactId>
  5. <version>0.1.53</version>
  6. </dependency>

2、简单例子,列出指定目录下的文件列表

  1. /** * 列出目录下的文件 * * @param directory * 要列出的目录 * @paramsftp * @return * @throwsSftpException */
  2. publicVectorlistFiles(String directory, ChannelSftpsftp) throwsSftpException {
  3. returnsftp.ls(directory);
  4. }

3、JSch实现SFTP功能一些主要类的介绍

1)JSch 类

2)Session 会话对象类

3)ChannelSFTP类
ChannelSFTP类是JSch实现SFTP核心类,它提供了一些SFTP常见的操作方法,如下

  1. 方法名 方法说明
  2. put() 文件上传 get() 文件下载 cd() 进入指定目录 ls() 得到指定目录下的文件列表 rename() 重命名(移动)指定文件或目录 rm() 删除指定文件 mkdir() 创建目录 rmdir() 删除目录(只允许删除空目录)

注:以上这些方法都有很多重载方法

4)SftpProgressMonitor 传输进度监控类

5)LsEntry 可以认为是文件服务器上的文件条目信息,把包含文件或者目录相关属性 。ls命令返回的Vector中的就是LsEntry对象列表

4、SFTP文件传输的实现步骤

  1. /** * 上传文件 * * @param directory * 上传的目录 * @paramuploadFile * 要上传的文件 * @paramsftp */
  2. publicvoid upload(String directory, String uploadFile, ChannelSftpsftp) {
  3. try {
  4. sftp.cd(directory);
  5. File file = new File(uploadFile);
  6. sftp.put(newFileInputStream(file), file.getName());
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
  10. }

5、JSch中文乱码处理

使用jsch-0.1.51进行SFTP文件传输时,对中文处理会出现乱码,并且也无法通过setFileNameEncoding()方法来设置编码。
解决方案:
下载jsch-0.1.51源代码,在ChannelSFTP.java文件中找到SENDINIT( )方法,修改红色部分的内容

  1. private void sendINIT() throws Exception {
  2. this.packet.reset();
  3. putHEAD((byte)1, 5);
  4. this.buf.putInt(3); //修改为 this.buf.putInt(2);
  5. getSession().write(this.packet, this, 9);
  6. }

然后编译并更改jar中的对应class文件即可。

发表评论

表情:
评论列表 (有 0 条评论,563人围观)

还没有评论,来说两句吧...

相关阅读