zoukankan      html  css  js  c++  java
  • Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】

    【】如何区分是需要使用SFTP还是FTP?

    【】我觉得:

    1、看是否已知私钥

      SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道私钥 privateKey  ,如果有 私钥 那么就用 SFTP,否则 就是用 FTP。

    2、看端口号。

      如果端口号是21,那么就用FTP,否则就用 SFTP

    ===============

    转:

    Java使用SFTP和FTP两种连接方式实现对服务器的上传下载

    版权声明:本文为原创文章,如有不足之处可以指出,欢迎大家转载,记得标明出处。 https://blog.csdn.net/a745233700/article/details/79322757

    一、Java实现对SFTP服务器的文件的上传下载

    1、添加maven依赖:

      <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>


    2、SFTPUtil工具类:

       import java.io.ByteArrayInputStream;  
        import java.io.File;  
        import java.io.FileInputStream;  
        import java.io.FileNotFoundException;  
        import java.io.FileOutputStream;  
        import java.io.IOException;  
        import java.io.InputStream;  
        import java.io.UnsupportedEncodingException;  
        import java.util.Properties;  
        import java.util.Vector;  
          
        import org.apache.commons.io.IOUtils;  
        import org.slf4j.Logger;  
        import org.slf4j.LoggerFactory;  
          
        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;  
        import com.jcraft.jsch.SftpException;
        /**
        * 类说明 sftp工具类
        */
        public class SFTPUtil {
            private transient Logger log = LoggerFactory.getLogger(this.getClass());  
            
            private ChannelSftp sftp;  
                
            private Session session;  
            /** SFTP 登录用户名*/    
            private String username;
            /** SFTP 登录密码*/    
            private String password;  
            /** 私钥 */    
            private String privateKey;  
            /** SFTP 服务器地址IP地址*/    
            private String host;  
            /** SFTP 端口*/  
            private int port;  
                
            
            /**  
             * 构造基于密码认证的sftp对象  
             */    
            public SFTPUtil(String username, String password, String host, int port) {  
                this.username = username;  
                this.password = password;  
                this.host = host;  
                this.port = port;  
            }
            
            /**  
             * 构造基于秘钥认证的sftp对象
             */  
            public SFTPUtil(String username, String host, int port, String privateKey) {  
                this.username = username;  
                this.host = host;  
                this.port = port;  
                this.privateKey = privateKey;  
            }  
            
            public SFTPUtil(){}  
            
            
            /**
             * 连接sftp服务器
             */  
            public void login(){  
                try {  
                    JSch jsch = new JSch();  
                    if (privateKey != null) {  
                        jsch.addIdentity(privateKey);// 设置私钥  
                    }  
            
                    session = jsch.getSession(username, host, port);  
                   
                    if (password != null) {  
                        session.setPassword(password);    
                    }  
                    Properties config = new Properties();  
                    config.put("StrictHostKeyChecking", "no");  
                        
                    session.setConfig(config);  
                    session.connect();  
                      
                    Channel channel = session.openChannel("sftp");  
                    channel.connect();  
            
                    sftp = (ChannelSftp) channel;  
                } catch (JSchException e) {  
                    e.printStackTrace();
                }  
            }    
            
            /**
             * 关闭连接 server  
             */  
            public void logout(){  
                if (sftp != null) {  
                    if (sftp.isConnected()) {  
                        sftp.disconnect();  
                    }  
                }  
                if (session != null) {  
                    if (session.isConnected()) {  
                        session.disconnect();  
                    }  
                }  
            }  
         
            
            /**  
             * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
             * @param basePath  服务器的基础路径
             * @param directory  上传到该目录  
             * @param sftpFileName  sftp端文件名  
             * @param in   输入流  
             */  
            public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{  
                try {   
                    sftp.cd(basePath);
                    sftp.cd(directory);  
                } catch (SftpException e) {
                    //目录不存在,则创建文件夹
                    String [] dirs=directory.split("/");
                    String tempPath=basePath;
                    for(String dir:dirs){
                        if(null== dir || "".equals(dir)) continue;
                        tempPath+="/"+dir;
                        try{
                            sftp.cd(tempPath);
                        }catch(SftpException ex){
                            sftp.mkdir(tempPath);
                            sftp.cd(tempPath);
                        }
                    }
                }  
                sftp.put(input, sftpFileName);  //上传文件
            }
            
         
            /**
             * 下载文件。
             * @param directory 下载目录  
             * @param downloadFile 下载的文件
             * @param saveFile 存在本地的路径
             */    
            public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{  
                if (directory != null && !"".equals(directory)) {  
                    sftp.cd(directory);  
                }  
                File file = new File(saveFile);  
                sftp.get(downloadFile, new FileOutputStream(file));  
            }  
            
            /**  
             * 下载文件
             * @param directory 下载目录
             * @param downloadFile 下载的文件名
             * @return 字节数组
             */  
            public byte[] download(String directory, String downloadFile) throws SftpException, IOException{  
                if (directory != null && !"".equals(directory)) {  
                    sftp.cd(directory);  
                }  
                InputStream is = sftp.get(downloadFile);  
                  
                byte[] fileData = IOUtils.toByteArray(is);  
                  
                return fileData;  
            }  
            
            
            /**
             * 删除文件
             * @param directory 要删除文件所在目录
             * @param deleteFile 要删除的文件
             */  
            public void delete(String directory, String deleteFile) throws SftpException{  
                sftp.cd(directory);  
                sftp.rm(deleteFile);  
            }  
            
            
            /**
             * 列出目录下的文件
             * @param directory 要列出的目录
             * @param sftp
             */  
            public Vector<?> listFiles(String directory) throws SftpException {  
                return sftp.ls(directory);  
            }  
              
            //上传文件测试
            public static void main(String[] args) throws SftpException, IOException {  
                SFTPUtil sftp = new SFTPUtil("用户名", "密码", "ip地址", 22);  
                sftp.login();  
                File file = new File("D:\图片\t0124dd095ceb042322.jpg");  
                InputStream is = new FileInputStream(file);  
                  
                sftp.upload("基础路径","文件路径", "test_sftp.jpg", is);  
                sftp.logout();  
            }  
        }



     

    二、Java实现对FTP服务器的文件的上传下载


     

        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.OutputStream;
         
        import org.apache.commons.net.ftp.FTP;
        import org.apache.commons.net.ftp.FTPClient;
        import org.apache.commons.net.ftp.FTPFile;
        import org.apache.commons.net.ftp.FTPReply;
         
        /**
         * ftp上传下载工具类
         */
        public class FtpUtil {
         
            /**
             * Description: 向FTP服务器上传文件
             * @param host FTP服务器hostname
             * @param port FTP服务器端口
             * @param username FTP登录账号
             * @param password FTP登录密码
             * @param basePath FTP服务器基础目录
             * @param filePath FTP服务器文件存放路径。文件的路径为basePath+filePath
             * @param filename 上传到FTP服务器上的文件名
             * @param input 输入流
             * @return 成功返回true,否则返回false
             */  
            public static boolean uploadFile(String host, int port, String username, String password, String basePath,
                    String filePath, String filename, InputStream input) {
                boolean result = false;
                FTPClient ftp = new FTPClient();
                try {
                    int reply;
                    ftp.connect(host, port);// 连接FTP服务器
                    // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                    ftp.login(username, password);// 登录
                    reply = ftp.getReplyCode();
                    if (!FTPReply.isPositiveCompletion(reply)) {
                        ftp.disconnect();
                        return result;
                    }
                    //切换到上传目录
                    if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                        //如果目录不存在创建目录
                        String[] dirs = filePath.split("/");
                        String tempPath = basePath;
                        for (String dir : dirs) {
                            if (null == dir || "".equals(dir)) continue;
                            tempPath += "/" + dir;
                            if (!ftp.changeWorkingDirectory(tempPath)) {  //进不去目录,说明该目录不存在
                                if (!ftp.makeDirectory(tempPath)) { //创建目录
                                    //如果创建文件目录失败,则返回
                                    System.out.println("创建文件目录"+tempPath+"失败");
                                    return result;
                                } else {
                                    //目录存在,则直接进入该目录
                                    ftp.changeWorkingDirectory(tempPath);    
                                }
                            }
                        }
                    }
                    //设置上传文件的类型为二进制类型
                    ftp.setFileType(FTP.BINARY_FILE_TYPE);
                    //上传文件
                    if (!ftp.storeFile(filename, input)) {
                        return result;
                    }
                    input.close();
                    ftp.logout();
                    result = true;
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (ftp.isConnected()) {
                        try {
                            ftp.disconnect();
                        } catch (IOException ioe) {
                        }
                    }
                }
                return result;
            }
            
            /**
             * Description: 从FTP服务器下载文件
             * @param host FTP服务器hostname
             * @param port FTP服务器端口
             * @param username FTP登录账号
             * @param password FTP登录密码
             * @param remotePath FTP服务器上的相对路径
             * @param fileName 要下载的文件名
             * @param localPath 下载后保存到本地的路径
             * @return
             */  
            public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
                    String fileName, String localPath) {
                boolean result = false;
                FTPClient ftp = new FTPClient();
                try {
                    int reply;
                    ftp.connect(host, port);
                    // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                    ftp.login(username, password);// 登录
                    reply = ftp.getReplyCode();
                    if (!FTPReply.isPositiveCompletion(reply)) {
                        ftp.disconnect();
                        return result;
                    }
                    ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
                    FTPFile[] fs = ftp.listFiles();
                    for (FTPFile ff : fs) {
                        if (ff.getName().equals(fileName)) {
                            File localFile = new File(localPath + "/" + ff.getName());
         
                            OutputStream is = new FileOutputStream(localFile);
                            ftp.retrieveFile(ff.getName(), is);
                            is.close();
                        }
                    }
         
                    ftp.logout();
                    result = true;
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (ftp.isConnected()) {
                        try {
                            ftp.disconnect();
                        } catch (IOException ioe) {
                        }
                    }
                }
                return result;
            }
         
            //ftp上传文件测试main函数
            public static void main(String[] args) {
                try {  
                    FileInputStream in=new FileInputStream(new File("D:\Tomcat 5.5\pictures\t0176ee418172932841.jpg"));  
                    boolean flag = uploadFile("192.168.111.128", 21, "用户名", "密码", "/www/images","/2017/11/19", "hello.jpg", in);  
                    System.out.println(flag);  
                } catch (FileNotFoundException e) {  
                    e.printStackTrace();  
                }  
            }
        }

     
    ---------------------
    作者:a745233700
    来源:CSDN
    原文:https://blog.csdn.net/a745233700/article/details/79322757
    版权声明:本文为博主原创文章,转载请附上博文链接!

    ====================

    【】注意:用上面的FTP上传文件方法,如果上传的文件名称为中文,会出现乱码,解决方法为:

    将上传文件中文件名相关那行

    • //上传文件
      if (!ftp.storeFile(filename, input)) {
      return result;
      }

    改为

    //上传文件            

     if (!ftp.storeFile(new String(filename.getBytes("GBK"),"iso-8859-1"), input)) {
            return result;
     }

    因为FTP上传时,中文名默认为 iso-8859-1 编码,而我们在编辑器中写的中文字符串默认为 GBK 编码。

    这是一般情况,如果  领导要求:所有 FTP上传的文件(文件名)都要用 UTF-8 编码,那么就需要将上面代码中的 GBK 改成 UTF-8 ,也就是改成如下

    改为

    //上传文件            

     if (!ftp.storeFile(new String(filename.getBytes("utf-8"),"iso-8859-1"), input)) {
            return result;
     }

    还要注意,如果修改了上述的 文件名称编码,那么,对应的 从FTP 取文件的 download 方法中的从FTP读取到的文件名称也要做对应的转换,才能得到我们上传的文件名称,同样,我们用 各种 图形化 工具时也要设置成对应的编码,才能正确显示FTP上的文件名。

    -------------

    FTP针对UTF-8优化版本:

    下面是针对 统一约定用 UTF-8 编码存储文件的优化版本,上传、校验是否存在、下载都没有问题,可以直接使用:

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
         
        /**
         * ftp上传下载工具类lb
         */
        public class FtpUtil3 {
         
            /**
             * Description: 向FTP服务器上传文件
             * @param host FTP服务器hostname
             * @param port FTP服务器端口
             * @param username FTP登录账号
             * @param password FTP登录密码
             * @param basePath FTP服务器基础目录
             * @param filePath FTP服务器文件存放路径。文件的路径为basePath+filePath
             * @param filename 上传到FTP服务器上的文件名
             * @param input 输入流
             * @return 成功返回true,否则返回false
             */  
            public static boolean uploadFile(String host, int port, String username, String password, String basePath,
                    String filePath, String filename, InputStream input) {
                boolean result = false;
                FTPClient ftp = new FTPClient();
                try {
                    int reply;
                    ftp.connect(host, port);// 连接FTP服务器
                    // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                    ftp.login(username, password);// 登录
                    reply = ftp.getReplyCode();
                    if (!FTPReply.isPositiveCompletion(reply)) {
                        ftp.disconnect();
                        return result;
                    }
                    //切换到上传目录
                    if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                        //如果目录不存在创建目录
                        String[] dirs = filePath.split("/");
                        String tempPath = basePath;
                        for (String dir : dirs) {
                            if (null == dir || "".equals(dir)) continue;
                            tempPath += "/" + dir;
                            if (!ftp.changeWorkingDirectory(tempPath)) {  //进不去目录,说明该目录不存在
                                if (!ftp.makeDirectory(tempPath)) { //创建目录
                                    //如果创建文件目录失败,则返回
                                    System.out.println("创建文件目录"+tempPath+"失败");
                                    return result;
                                } else {
                                    //目录存在,则直接进入该目录
                                    ftp.changeWorkingDirectory(tempPath);    
                                }
                            }
                        }
                    }
                    //被动模式(可以提高针对不同FTP服务器的兼容性)
                    ftp.enterLocalPassiveMode();
                    //设置上传文件的类型为二进制类型
                    ftp.setFileType(FTP.BINARY_FILE_TYPE);
                    //上传文件
    //                if (!ftp.storeFile(filename, input)) {
                    if (!ftp.storeFile(new String(filename.getBytes("UTF-8"), "iso-8859-1"), input)) {
                        return result;
                    }
                    input.close();
                    ftp.logout();
                    result = true;
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (ftp.isConnected()) {
                        try {
                            ftp.disconnect();
                        } catch (IOException ioe) {
                        }
                    }
                }
                return result;
            }
            
            /**
             * Description: 从FTP服务器下载文件
             * @param host FTP服务器hostname
             * @param port FTP服务器端口
             * @param username FTP登录账号
             * @param password FTP登录密码
             * @param remotePath FTP服务器上的相对路径
             * @param fileName 要下载的文件名
             * @param localPath 下载后保存到本地的路径
             * @return
             */  
            public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
                    String fileName, String localPath) {
                boolean result = false;
                FTPClient ftp = new FTPClient();
                try {
                    int reply;
                    ftp.connect(host, port);
                    // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                    ftp.login(username, password);// 登录
                    reply = ftp.getReplyCode();
                    if (!FTPReply.isPositiveCompletion(reply)) {
                        ftp.disconnect();
                        return result;
                    }
                    ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
                    ftp.setControlEncoding("UTF-8");
                    //被动模式(可以提高针对不同FTP服务器的兼容性)
                    ftp.enterLocalPassiveMode();
                    FTPFile[] fs = ftp.listFiles();
                    for (FTPFile ff : fs) {
                        if (ff.getName().equals(fileName)) {
                            File localFile = new File(localPath + "/" + ff.getName());
         
                            OutputStream is = new FileOutputStream(localFile);
                            // ftp需使用ISO-8859-1编码格式
                            String realName = new String(ff.getName().getBytes("UTF-8"), "ISO-8859-1");
    //                        ftp.retrieveFile(ff.getName(), is);
                            ftp.retrieveFile(realName, is);
                            is.close();
                        }
                    }
         
                    ftp.logout();
                    result = true;
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (ftp.isConnected()) {
                        try {
                            ftp.disconnect();
                        } catch (IOException ioe) {
                        }
                    }
                }
                return result;
            }
            
            /**
             * 直接将远程文件下载到流中【注意:使用完要记住关闭返回的InputStream流】
             * @param host
             * @param port
             * @param username
             * @param password
             * @param remotePath
             * @param fileName
             * @return 直接将远程文件下载到流中
             */
            public static InputStream downloadFile(String host, int port, String username, String password, String remotePath,
                    String fileName) {
                InputStream result = null;
                FTPClient ftp = new FTPClient();
                try {
                    int reply;
                    ftp.connect(host, port);
                    // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                    ftp.login(username, password);// 登录
                    reply = ftp.getReplyCode();
                    if (!FTPReply.isPositiveCompletion(reply)) {
                        ftp.disconnect();
                        return result;
                    }
                    ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
                    ftp.setControlEncoding("UTF-8");
                      //被动模式(可以提高针对不同FTP服务器的兼容性)
                    ftp.enterLocalPassiveMode();
                    // ftp需使用ISO-8859-1编码格式
                    String realName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
                    result = ftp.retrieveFileStream(realName);
                    ftp.logout();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (ftp.isConnected()) {
                        try {
                            ftp.disconnect();
                        } catch (IOException ioe) {
                        }
                    }
                }
                return result;
            }
            
            /**
             * Description: 判断指定名称的文件在FTP服务器上是否存在
             * @param host FTP服务器hostname
             * @param port FTP服务器端口
             * @param username FTP登录账号
             * @param password FTP登录密码
             * @param remotePath FTP服务器上的相对路径
             * @param fileName 要下载的文件名
             * @param localPath 下载后保存到本地的路径
             * @return true:存在   false:不存在/或者方法出现错误
             * @throws Exception 
             */  
            public static boolean isExistInFTP(String host, int port, String username, String password, String remotePath,
                    String fileName){
                boolean result = false;
                FTPClient ftp = new FTPClient();
                try {
                    int reply;
                    ftp.connect(host, port);
                    // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                    ftp.login(username, password);// 登录
                    reply = ftp.getReplyCode();
                    if (!FTPReply.isPositiveCompletion(reply)) {
                        ftp.disconnect();
    //                    return result;
                        throw new RuntimeException("FTP连接异常。。。");
                    }
                    ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
                    //这一行一定要有,否则取到的文件名会乱码,无法和参数 fileName 匹配
                    ftp.setControlEncoding("UTF-8");
                      //被动模式(可以提高针对不同FTP服务器的兼容性)
                    ftp.enterLocalPassiveMode();
                    FTPFile[] fs = ftp.listFiles();
                    for (FTPFile ff : fs) {
                        String name = ff.getName();
                        if (name.equals(fileName)) {
                            result = true;
                            break;
    //                        OutputStream is = new FileOutputStream(localFile);
    //                        ftp.retrieveFile(ff.getName(), is);
    //                        is.close();
                        }
                    }
                    ftp.logout();
                } catch (Exception e) {
                    System.out.println("------------查询FTP上文件是否存在时出现异常,直接返回:不存在------------");
                    e.printStackTrace();
                } finally {
                    if (ftp.isConnected()) {
                        try {
                            ftp.disconnect();
                        } catch (IOException ioe) {
                        }
                    }
                }
                return result;
            }
         
    //        ftp上传文件测试main函数
            public static void main(String[] args) {
                try {  
    //                FileInputStream in=new FileInputStream(new File("D:\Tomcat 5.5\pictures\t0176ee418172932841.jpg"));  
    //                boolean flag = uploadFile("192.168.111.128", 21, "用户名", "密码", "/www/images","/2017/11/19", "hello.jpg", in);  
                    
    //                FileInputStream in=new FileInputStream(new File("D:/副本2.txt"));
    
                    boolean flag = false;
    //                boolean flag = uploadFile("10.18.90.13", 21, "root", "root", "/crm/fileUpload/Account/test","", "副本291195.txt", in); 
    //                flag =uploadFile("10.12.9.163",21,"aps","aps","/crm/fileUpload/Account/test","","副本291195.txt",in);
    //                String name = "zhicai-beijing-00000385-20190624.txt";
                    String name = "记录.txt";
    //                String name = "asgagh2.txt";
    //                flag =downloadFile("10.12.9.163", 21, "apps","apps", "/crm/fileUpload/Account/test", name, "D:/a/b/f");
                    InputStream input = downloadFile("10.12.9.163", 21, "apps","apps", "/crm/fileUpload/Account/test", name);
                    byte[] buffer = new byte[input.available()];
                    input.read(buffer);
                    FileOutputStream out;
                    out = new FileOutputStream("D:/a/b/f/1.txt");
                    out.write(buffer);
                    out.close();
    //                        loadFile("10.12.9.163",21,"apps","apps","/crm/fileUpload/Account/test","","副本291195.txt",in);
    //                System.out.println(flag);
    //                flag =uploadFile("10.12.4.159",2121,"ji","Y349#","/jitiles/excel","","副本291195.txt",in);
                    System.out.println(flag); 
                    
    //                boolean existInFTP = FtpUtil3.isExistInFTP("10.18.90.13",21,"root","root","/fileUpload/Account/test6","副本291195.txt");
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }
            
        }
  • 相关阅读:
    POJ1239
    HDU 2829 四边形不等式优化
    返回数字二进制的最高位位数o(n)
    矩阵快速幂 模板
    HDU4718 The LCIS on the Tree(LCT)
    HDU4010 Query on The Trees(LCT)
    HDU3487 Play With Chains(Splay)
    CF444C DZY Loves Colors
    HDU4836 The Query on the Tree(树状数组&&LCA)
    HDU4831&&4832&&4834
  • 原文地址:https://www.cnblogs.com/libin6505/p/10583438.html
Copyright © 2011-2022 走看看