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

package com.duodian;
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 java.util.Properties;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;import com.jcraft.jsch.Channel;
 import com.jcraft.jsch.ChannelSftp;
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
  
 /**
  * ftp上传下载工具类
  */
 public class FTPUtil {
  
     
     /** FTP 登录用户名*/    
     private static String username; 
     /** FTP 登录密码*/    
     private static String password;  
     /** FTP 服务器地址IP地址*/    
     private static String host;  
     /** FTP 端口*/  
     private static int port;  
     /** FTP FTPClient*/  
     public static FTPClient ftp;  
     
     
     /**  
      * 构造基于密码认证的sftp对象  
      */    
     public FTPUtil(String username, String password, String host, int port) {  
         this.username = username;  
         this.password = password;  
         this.host = host;  
         this.port = port;  
     } 
     
     
     /** 
      * 连接ftp服务器 
      * @return 成功返回true,否则返回false 
      */  
     public static boolean login(){  
         try {
             
             ftp = new FTPClient();
             ftp.connect(host, port);// 连接FTP服务器
             // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
             ftp.login(username, password);// 登录
             ftp.setConnectTimeout(180000);
             int reply;
             
             reply = ftp.getReplyCode();
             if (!FTPReply.isPositiveCompletion(reply)) {
                 ftp.disconnect();
                 System.err.println("FTP sever refused connectd");
                 return false;
             }
             
         } catch (Exception e) {
             // TODO: handle exception
             return false;
         }
         return true;  
     }    
     
     /** 
      * 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 basePath,String filePath, String filename, InputStream input) {
         boolean result = false;
         
         try {
             
             //切换到上传目录
             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.enterLocalActiveMode();
             ftp.enterLocalPassiveMode();
             //设置上传文件的类型为二进制类型
             ftp.setFileType(FTP.BINARY_FILE_TYPE);
             //上传文件
             result = ftp.storeFile(filename, input);
             if (!result) {
                 return result;
             }
             input.close();
             //ftp.logout();
             result = true;
         } catch (IOException e) {
             e.printStackTrace();
         } 
         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 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:\\uploadFile\\deviceInfo\\2020-05-12.csv"));  
             new FTPUtil("root", "root", "ip", 9999);
             boolean isOk = login();
             System.out.println("----"+isOk);
             boolean flag = uploadFile("/","device_info", "2020-05-12.csv", in);  
             System.out.println(flag);  
         } catch (FileNotFoundException e) {  
             e.printStackTrace();  
         }  
     }
 }

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

package com.duodian;
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 com.jcraft.jsch.Channel;
 import com.jcraft.jsch.ChannelSftp;
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Logger;
 import com.jcraft.jsch.Session;
 import com.jcraft.jsch.SftpException;  
   
 import org.apache.commons.io.IOUtils;  
 //import org.slf4j.Logger;  
 //import org.slf4j.LoggerFactory; 
 /** 
 * 类说明 sftp工具类
 * @author xiaoyin
 */
 public class SFTPUtil {
     //private transient Logger log = LoggerFactory.getLogger(this.getClass());  
     
     public static ChannelSftp sftp;  
         
     private static Session session;  
     /** SFTP 登录用户名*/    
     private static String username; 
     /** SFTP 登录密码*/    
     private static String password;  
     /** 私钥 */    
     private static String privateKey;  
     /** SFTP 服务器地址IP地址*/    
     private static String host;  
     /** SFTP 端口*/  
     private static 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 static 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();  
             session.setTimeout(180000);  
             Channel channel = session.openChannel("sftp");  
             channel.connect();  
     
             sftp = (ChannelSftp) channel;  
            
         } catch (JSchException e) {  
             e.printStackTrace();
         }  
     }    
     
     /** 
      * 关闭连接 server  
      */  
     public static 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 static 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("root", "root", "ip", 22);  
         sftp.login();  
         System.out.println(sftp.sftp.isConnected());
         System.out.println(sftp.sftp.getExitStatus());
         for(int i=0;i<5;i++) {
             File file = new File("D:\\uploadFile\\ftp.txt");  
             InputStream is = new FileInputStream(file);  
               
             sftp.upload("/root/nginx/","uploadFile", System.currentTimeMillis()+".txt", is);
         }
           
         sftp.logout();  
         System.out.println(sftp.sftp.isConnected());
     }  
 }