栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java实现sftp客户端上传文件以及文件夹的功能代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java实现sftp客户端上传文件以及文件夹的功能代码

1.依赖的jar文件 jsch-0.1.53.jar

2.登录方式有密码登录,和密匙登录

 代码:

主函数:

import java.util.Properties;

import com.cloudpower.util.Login;
import com.util.LoadProperties;

public class Ftp {
  public static void main(String[] args) {
    Properties properties = LoadProperties.getProperties();
    Login.login(properties);
  }
}

登陆页面的代码:

package com.cloudpower.util;

import java.io.Console;
import java.util.Properties;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class Login {

  public static void login(Properties properties) {
    String ip = properties.getProperty("ip");
    String user = properties.getProperty("user");
    String pwd = properties.getProperty("pwd");
    String port = properties.getProperty("port");
    String privateKeyPath = properties.getProperty("privateKeyPath");
    String passphrase = properties.getProperty("passphrase");
    String sourcePath = properties.getProperty("sourcePath");
    String destinationPath = properties.getProperty("destinationPath");

    if (ip != null && !ip.equals("") && user != null && !user.equals("")
 && port != null && !port.equals("") && sourcePath != null
 && !sourcePath.equals("") && destinationPath != null
 && !destinationPath.equals("")) {

      if (privateKeyPath != null && !privateKeyPath.equals("")) {
 sshSftp2(ip, user, Integer.parseInt(port), privateKeyPath,
     passphrase, sourcePath, destinationPath);
      } else if (pwd != null && !pwd.equals("")) {
 sshSftp(ip, user, pwd, Integer.parseInt(port), sourcePath,
     destinationPath);
      } else {
 Console console = System.console();
 System.out.print("Enter password:");
 char[] readPassword = console.readPassword();
 sshSftp(ip, user, new String(readPassword),
     Integer.parseInt(port), sourcePath, destinationPath);
      }
    } else {
      System.out.println("请先设置配置文件");
    }
  }

  
  public static void sshSftp(String ip, String user, String psw, int port,
      String sPath, String dPath) {
    System.out.println("password login");
    Session session = null;

    JSch jsch = new JSch();
    try {
      if (port <= 0) {
 // 连接服务器,采用默认端口
 session = jsch.getSession(user, ip);
      } else {
 // 采用指定的端口连接服务器
 session = jsch.getSession(user, ip, port);
      }

      // 如果服务器连接不上,则抛出异常
      if (session == null) {
 throw new Exception("session is null");
      }

      // 设置登陆主机的密码
      session.setPassword(psw);// 设置密码
      // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
      session.setConfig("StrictHostKeyChecking", "no");
      // 设置登陆超时时间
      session.connect(300000);
      UpLoadFile.upLoadFile(session, sPath, dPath);
    } catch (Exception e) {
      e.printStackTrace();
    }

    System.out.println("success");
  }

  
  public static void sshSftp2(String ip, String user, int port,
      String privateKey, String passphrase, String sPath, String dPath) {
    System.out.println("privateKey login");
    Session session = null;
    JSch jsch = new JSch();
    try {
      // 设置密钥和密码
      // 支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了
      if (privateKey != null && !"".equals(privateKey)) {
 if (passphrase != null && "".equals(passphrase)) {
   // 设置带口令的密钥
   jsch.addIdentity(privateKey, passphrase);
 } else {
   // 设置不带口令的密钥
   jsch.addIdentity(privateKey);
 }
      }
      if (port <= 0) {
 // 连接服务器,采用默认端口
 session = jsch.getSession(user, ip);
      } else {
 // 采用指定的端口连接服务器
 session = jsch.getSession(user, ip, port);
      }
      // 如果服务器连接不上,则抛出异常
      if (session == null) {
 throw new Exception("session is null");
      }
      // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
      session.setConfig("StrictHostKeyChecking", "no");
      // 设置登陆超时时间
      session.connect(300000);
      UpLoadFile.upLoadFile(session, sPath, dPath);
      System.out.println("success");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

文件上传的代码:

package com.cloudpower.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class UpLoadFile {
  public static void upLoadFile(Session session, String sPath, String dPath) {

    Channel channel = null;
    try {
      channel = (Channel) session.openChannel("sftp");
      channel.connect(10000000);
      ChannelSftp sftp = (ChannelSftp) channel;
      try {
 sftp.cd(dPath);
 Scanner scanner = new Scanner(System.in);
 System.out.println(dPath + ":此目录已存在,文件可能会被覆盖!是否继续y/n?");
 String next = scanner.next();
 if (!next.toLowerCase().equals("y")) {
   return;
 }

      } catch (SftpException e) {

 sftp.mkdir(dPath);
 sftp.cd(dPath);

      }
      File file = new File(sPath);
      copyFile(sftp, file, sftp.pwd());
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      session.disconnect();
      channel.disconnect();
    }
  }

  public static void copyFile(ChannelSftp sftp, File file, String pwd) {

    if (file.isDirectory()) {
      File[] list = file.listFiles();
      try {
 try {
   String fileName = file.getName();
   sftp.cd(pwd);
   System.out.println("正在创建目录:" + sftp.pwd() + "/" + fileName);
   sftp.mkdir(fileName);
   System.out.println("目录创建成功:" + sftp.pwd() + "/" + fileName);
 } catch (Exception e) {
   // TODO: handle exception
 }
 pwd = pwd + "/" + file.getName();
 try {

   sftp.cd(file.getName());
 } catch (SftpException e) {
   // TODO: handle exception
   e.printStackTrace();
 }
      } catch (Exception e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
      }
      for (int i = 0; i < list.length; i++) {
 copyFile(sftp, list[i], pwd);
      }
    } else {

      try {
 sftp.cd(pwd);

      } catch (SftpException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
      }
      System.out.println("正在复制文件:" + file.getAbsolutePath());
      InputStream instream = null;
      OutputStream outstream = null;
      try {
 outstream = sftp.put(file.getName());
 instream = new FileInputStream(file);

 byte b[] = new byte[1024];
 int n;
 try {
   while ((n = instream.read(b)) != -1) {
     outstream.write(b, 0, n);
   }
 } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
 }

      } catch (SftpException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
      } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
      } finally {
 try {
   outstream.flush();
   outstream.close();
   instream.close();

 } catch (Exception e2) {
   // TODO: handle exception
   e2.printStackTrace();
 }
      }
    }
  }

}

读取配置文件的代码:

package com.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class LoadProperties {
  public static Properties getProperties() {

    File file = new File(Class.class.getClass().getResource("/").getPath()
 + "properties.properties");

    InputStream inputStream = null;

    try {
      inputStream = new FileInputStream(file);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    Properties properties = new Properties();
    try {
      properties.load(inputStream);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    return properties;

  }
}

代码目录结构:

测试运行时配置文件放在项目的bin目录下(打包成可运行jar文件的时候要删除,打包完成后将配置文件和jar包放在同级目录下即可):

properties.properties

ip=
user=
pwd=
port=22
privateKeyPath=
passphrase=
sourcePath=
destinationPath=/home/dbbs/f

打包可运行jar文件:

Export->java->Runnabe JAR file

完成后

在控制台运行java -jar  导出jar包的名字.jar 即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/147776.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号