zoukankan      html  css  js  c++  java
  • java实现sftp客户端上传文件夹的功能

    使用的jar:

    <dependencies>
        <dependency>
            <groupId>jsch</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.53</version>
        </dependency>
    </dependencies>

    入口方法:

    import java.util.HashMap;
    
    public class Sftp {
        public static void main(String[] args) {
    
            String helpMessage = "You need enter 5 args
    "
                    + "1. target ip or domain name
    "
                    + "2. target user
    "
                    + "3. target password
    "
                    + "4. source path
    "
                    + "5. destination path
    ";
    
            if (args[0].equalsIgnoreCase("-help") || args[0].equalsIgnoreCase("-h")) {
                System.out.println(helpMessage);
            }
    
            if (args.length != 5) {
                System.out.println("The number of parameters entered is incorrect!
    " + helpMessage);
                return;
            }
    
            HashMap<String, String> map = new HashMap<>(8);
            map.put("ip",args[0]);
            map.put("user",args[1]);
            map.put("pwd",args[2]);
            map.put("sourcePath",args[3]);
            map.put("destinationPath",args[4]);
            map.put("port","22");
            Login.login(map);
        }
    }

    登录处理:

    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("请先设置配置文件");
            }
        }
    
        /**
         * 密码方式登录
         *
         * @param ip
         * @param user
         * @param psw
         * @param port
         * @param sPath
         * @param dPath
         */
        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");
        }
    
        /**
         * 密匙方式登录
         *
         * @param ip
         * @param user
         * @param port
         * @param privateKey
         * @param passphrase
         * @param sPath
         * @param dPath
         */
        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();
            }
        }
    }
    Login.java

    文件上传的代码:

    import java.io.*;
    import java.util.Vector;
    
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;
    
    public class UpLoadFile {
        private static String split = "\";
    
        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;
    
                if (isDirExist(sftp, dPath)) {
                    String createPath = dPath + sPath.substring(sPath.lastIndexOf(split) + split.length());
                    if (isDirExist(sftp, createPath)) {
                        deleteSFTP(sftp, createPath);
                    }
                } else {
                    createDir(sftp, 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();
                    }
                }
            }
        }
    
        /**
         * 创建目录
         *
         * @param createPath
         * @return
         */
        public static void createDir(ChannelSftp sftp, String createPath) {
            try {
                if (isDirExist(createpath)) {
                    sftp.cd(createpath);
                }
                String pathArry[] = createpath.split("/");
                StringBuffer filePath = new StringBuffer("/");
                for (String path : pathArry) {
                    if (path.equals("")) {
                        continue;
                    }
                    filePath.append(path + "/");
                    if (isDirExist(filePath.toString())) {
                        sftp.cd(filePath.toString());
                    } else {
                        // 建立目录
                        sftp.mkdir(filePath.toString());
                        // 进入并设置为当前目录
                        sftp.cd(filePath.toString());
                    }
                }
            } catch (SftpException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 删除stfp文件
         *
         * @param directory:要删除文件所在目录
         */
        public static void deleteSFTP(ChannelSftp sftp, String directory) {
            try {
                if (isDirExist(directory)) {
                    Vector<ChannelSftp.LsEntry> vector = sftp.ls(directory);
                    if (vector.size() == 1) { // 文件,直接删除
                        sftp.rm(directory);
                    } else if (vector.size() == 2) { // 空文件夹,直接删除
                        sftp.rmdir(directory);
                    } else {
                        String fileName = "";
                        // 删除文件夹下所有文件
                        for (ChannelSftp.LsEntry en : vector) {
                            fileName = en.getFilename();
                            if (".".equals(fileName) || "..".equals(fileName)) {
                                continue;
                            } else {
                                deleteSFTP(sftp,directory + "/" + fileName);
                            }
                        }
                        // 删除文件夹
                        sftp.rmdir(directory);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 判断目录是否存在
         *
         * @param directory
         * @return
         */
        public static boolean isDirExist(String directory) {
            try {
                Vector<?> vector = sftp.ls(directory);
                return (null != vector);
            } catch (Exception e) {
                return false;
            }
        }
    }
    UpLoadFile.java

    参考:

    https://www.cnblogs.com/zuo-java/p/5913295.html

    https://www.cnblogs.com/future-eye/p/8194544.html

  • 相关阅读:
    Bitcode设置 编译问题
    NSDate 时间比较...等
    MagicalRecord 多表关联数据操作
    简单的 同步 异步 请求
    pod创建的工程找不到库
    UITableViewCell 自适应高度 ios8特性
    iOS中nil、Nil、NULL、NSNull详解(转)
    c++ wchar_t 与char 直接的转换【转】
    VS 2010 转到COFF期间失败。
    OpenCV中阈值(threshold)函数: threshold 。
  • 原文地址:https://www.cnblogs.com/boomoom/p/10306911.html
Copyright © 2011-2022 走看看