天天看點

java 中 FtpClient 實作 FTP 檔案上傳、下載下傳

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點選跳轉到教程。

源代碼大部分是網上找的,查來查去,找到幾個可以用的例子,改來改去,揉合成現在這個樣子。

一、 jar包準備(web service 的jar  不需要)

java 中 FtpClient 實作 FTP 檔案上傳、下載下傳

二、配置檔案:

java 中 FtpClient 實作 FTP 檔案上傳、下載下傳

配置檔案内容:

ftpUserName=hn_name
ftpPassword=hn_pwd
ftpHost=10.3.4.222
ftpPort=21
ftpPath=/home/hn_dhmp
writeTempFielPath=D\:\\ftpDownLoad
           

三、 ftp 工具類:

<strong>package ftp;


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

/**
 * ftp 上傳、下載下傳工具類
 * @author JiangYu
 */
public class FtpUtil {  
	
   private static Logger logger = Logger.getLogger(FtpUtil.class);  
     
   /** 
    * 擷取FTPClient對象 
    * @param ftpHost FTP主機伺服器 
    * @param ftpPassword FTP 登入密碼 
    * @param ftpUserName FTP登入使用者名 
    * @param ftpPort FTP端口 預設為21 
    * @return 
    */  
   public static FTPClient getFTPClient(String ftpHost, String ftpPassword,  
           String ftpUserName, int ftpPort) {  
	   
       FTPClient ftpClient = null;  
       try {  
           ftpClient = new FTPClient();  
           ftpClient.connect(ftpHost, ftpPort);// 連接配接FTP伺服器  
           ftpClient.login(ftpUserName, ftpPassword);// 登陸FTP伺服器  
           if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  
               logger.info("未連接配接到FTP,使用者名或密碼錯誤 !");  
               ftpClient.disconnect();  
           } else {  
               logger.info("FTP連接配接成功。");  
           }  
       } catch (SocketException e) {  
           e.printStackTrace();  
           logger.info("請檢查FTP的IP位址 ! ");  
       } catch (IOException e) {  
           e.printStackTrace();  
           logger.info("請核對FTP的端口 ! ");  
       }  
       return ftpClient;  
   }  
   
   /**
    * 上傳本地檔案到FTP伺服器   
    * @param ftpPath 伺服器上存放檔案的路徑
    * @param ftpUserName ftp服務賬号
    * @param ftpPassword ftp服務密碼
    * @param ftpHost ftp服務ip
    * @param ftpPort ftp服務端口
    * @param fileContent 檔案内容
    * @param writeTempFielPath 檔案在本地的路徑
    */
   public static String upload(String ftpPath, String ftpUserName, String ftpPassword,  
           String ftpHost, int ftpPort, String fileContent, String writeTempFielPath) {  
	   
       FTPClient ftpClient = null;  
       String uploadResult = "";
       try {  
           ftpClient = getFTPClient(ftpHost, ftpPassword,  
                   ftpUserName, ftpPort);  
           // 設定PassiveMode傳輸  
           ftpClient.enterLocalPassiveMode();  
           // 設定以二進制流的方式傳輸  
           ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
           // 對遠端目錄的處理  
           String remoteFileName = ftpPath;  
           if (ftpPath.contains("/")) {  
               remoteFileName = ftpPath  
                       .substring(ftpPath.lastIndexOf("/") + 1);  
           }  
           // 先把檔案寫出到本地,再上傳到FTP上,最後再删除 。
           String result = write(remoteFileName, fileContent,  
                   writeTempFielPath);  
           if (result.contains("成功")) {  
               File f = new File(writeTempFielPath + "/" + remoteFileName);  
               InputStream in = new FileInputStream(f);  
               ftpClient.storeFile(remoteFileName, in);  
               in.close();  
               uploadResult = "檔案" + remoteFileName + "上傳成功!";
               f.delete(); // 删除本地臨時檔案
           } else {  
        	   uploadResult =  "檔案" + remoteFileName + "上傳失敗!";
           }  
           return uploadResult;
       } catch (Exception e) {  
           e.printStackTrace();  
           return uploadResult+"錯誤源: "+e.getMessage();
       }finally{  
           try {  
               ftpClient.disconnect();  
           } catch (IOException e) {  
               e.printStackTrace();  
           }  
       }  
   }  
 
   /**
    * 檔案寫出到本地
    * @param fileName 檔案名
    * @param fileContext 檔案内容
    * @param writeTempFielPath 本地存儲路徑
    * @return
    */
   public static String write(String fileName, String fileContext,  
           String writeTempFielPath) {  
	   
	   String result = "寫出成功 !";
       try {  
           File f = new File(writeTempFielPath + "/" + fileName);  
           if(!f.exists()){  
               if(!f.createNewFile()){  
            	   result = "檔案不存在,建立失敗 !";
               }  
           }  
           BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));  
           bw.write(fileContext.replaceAll("\n", "\r\n"));  
           bw.flush();  
           bw.close();  
           return result;  
       } catch (Exception e) {  
    	   result = "寫出失敗 !";
           e.printStackTrace();  
           return result;  
       }  
   }  
   
   /** 
   * 從FTP伺服器下載下傳檔案 
   * @param ftpHost FTP伺服器IP 
   * @param port FTP伺服器端口 
   * @param username FTP登入賬号 
   * @param password FTP登入密碼 
   * @param remotePath FTP伺服器上的相對路徑 
   * @param fileName 要下載下傳的檔案名 
   * @param localPath 下載下傳後儲存到本地的路徑 
   * @return 
   */
   public static String downFile(String ftpHost, int port,String username, String password,
		   String remotePath,String fileName,String localPath) { 
	   
	   String result = "下載下傳失敗 !"; 
	   FTPClient ftp = new FTPClient(); 
	   
	   try { 
		   int reply; 
		   ftp.connect(ftpHost, port); 
		   ftp.login(username, password); // 登入 
		   reply = ftp.getReplyCode(); 
		   if (!FTPReply.isPositiveCompletion(reply)) { 
			   ftp.disconnect(); 
			   return "服務連接配接失敗 !"; 
		   } 
		   
		   ftp.changeWorkingDirectory(remotePath); // 轉移到FTP伺服器目錄 
		   FTPFile[] fs = ftp.listFiles(); 
		   boolean flag = false; // 下載下傳檔案不存在
		   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(); 
				   flag = true;
			   } 
		   }
		   ftp.logout(); 
		   
		   if(!flag){
			   result = "檔案: "+fileName+"不存在 !"; 
		   }else{
			   result = "下載下傳成功 !"; 
		   }
	   } catch (IOException e) { 
		   e.printStackTrace(); 
	   } finally { 
		   if (ftp.isConnected()) { 
			   try { 
				   ftp.disconnect(); 
			   } catch (IOException ioe) {} 
		   } 
	   } 
	   return result; 
   }
   
}  

</strong>
           

upload方法可以用這個方法代替,直接上傳整個檔案,而不作用把檔案内容作為參數,此方法主體代碼來自網絡:

package ftp;

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

import org.apache.commons.net.ftp.FTPClient;
/**
 * 檔案上傳替換方法 
 *
 */
public class FtpUpToo {

	private static FTPClient ftpClient = null;  
	   
	 /** 
     * ftp上傳檔案
     * @param targetFname 生成目标檔案 
     * @return true||false 
     */  
    public static boolean uploadFile(String targetFname){  
    	
    	int ftpPort = 0;  
        String ftpUserName = "";  // ftp服務賬号
        String ftpPassword = "";  // ftp服務密碼
        String ftpHost = "";  // ftp服務ip
        String ftpPath = "";  // ftp伺服器上存放檔案的路徑
        String writeTempFielPath = "";  // 檔案在本地的路徑
        String proName = "ftp.properties"; // 配置檔案名
         
        try {
             // 配置檔案一定要和本類放在同一包下才能找到 
        	 InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);  
             if (in == null) {  
				throw new Exception("配置檔案"+proName+"讀取失敗 !");
             } 
             
	         Properties properties = new Properties();  
	         properties.load(in);  
	         ftpUserName = properties.getProperty("ftpUserName");  
	         ftpPassword = properties.getProperty("ftpPassword");  
	         ftpHost = properties.getProperty("ftpHost");  
	         ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))  
	                 .intValue();  
	         ftpPath = properties.getProperty("ftpPath");  
	         writeTempFielPath = properties.getProperty("writeTempFielPath"); 
        } catch (Exception e) {
				e.printStackTrace();
		}    
	         
        boolean flag = false;  
        ftpClient = FtpUtil.getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort); 
        if( ftpClient!=null ){  
             File srcFile = new File(writeTempFielPath+"/JiangYuUp.csv");   
             FileInputStream fis = null;  
             try {  
                fis  = new FileInputStream(srcFile);  
                //設定上傳目錄   
                ftpClient.changeWorkingDirectory(ftpPath);  
                ftpClient.setBufferSize(1024);   
                ftpClient.setControlEncoding("GBK");   
                //設定檔案類型(二進制)   
                ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
                //上傳  
                flag = ftpClient.storeFile(targetFname, fis);   
            } catch (Exception e) {  
                e.printStackTrace();  
                closeCon();  
            }finally{  
            	try {
					fis.close();
					System.out.println("運作結束!----");
				} catch (IOException e) {
					e.printStackTrace();
				}
            }  
        }  
        return flag;  
    }
    
    
    /** 
     * 銷毀ftp連接配接
     */  
    public static void closeCon(){  
        if(ftpClient !=null){  
            if(ftpClient.isConnected()){  
                try {  
                    ftpClient.logout();  
                    ftpClient.disconnect();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }   
            }  
        }  
    }  
    
    
}
           

四、測試類:

<strong>package ftp;


import java.io.InputStream;
import java.util.Properties;
  
public class FtpTest {  
      
    public static void main(String[] args) {  
    	
    	new FtpTest().test();
       
    }  
    
    private void test(){
    	
    	 int ftpPort = 0;  
         String ftpUserName = "";  // ftp服務賬号
         String ftpPassword = "";  // ftp服務密碼
         String ftpHost = "";  // ftp服務ip
         String ftpPath = "";  // ftp伺服器上存放檔案的路徑
         String writeTempFielPath = "";  // 檔案在本地的路徑
         String proName = "ftp.properties"; // 配置檔案名
         
         try {  
        	 // 配置檔案一定要和本類放在同一包下才能找到 
             InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);  
             if (in == null) {  
                 throw new Exception("配置檔案"+proName+"讀取失敗 !");
             } 
             
	         Properties properties = new Properties();  
	         properties.load(in);  
	         ftpUserName = properties.getProperty("ftpUserName");  
	         ftpPassword = properties.getProperty("ftpPassword");  
	         ftpHost = properties.getProperty("ftpHost");  
	         ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))  
	                 .intValue();  
	         ftpPath = properties.getProperty("ftpPath");  
	         writeTempFielPath = properties.getProperty("writeTempFielPath");  
	         
	         // 下載下傳
	         String result = FtpUtil.downFile(ftpHost, ftpPort, ftpUserName, ftpPassword,
	        		 ftpPath, "JiangYu.csv", writeTempFielPath);  // JiangYu.csv:下載下傳檔案的名稱
	         System.out.println("檔案下載下傳結果為:" + result);  
	         
	         // 上傳
	         ftpPath = ftpPath + "/" + "JiangYu.csv";  // JiangYu.csv:上傳檔案的名稱
	         FtpUtil.upload(ftpPath, ftpUserName, ftpPassword, ftpHost, ftpPort, "這裡是檔案内容", writeTempFielPath);  
         } catch (Exception e) {  
             e.printStackTrace();  
         }  
    }
}  </strong>
           

注:  測試類運作後下載下傳成功的檔案 和 上傳時的臨時檔案是一樣的名字,會被上傳成功後删除臨時檔案操作所删除。

 建議上傳和下載下傳分開測試。

五、 上傳、下載下傳結果:

java 中 FtpClient 實作 FTP 檔案上傳、下載下傳
java 中 FtpClient 實作 FTP 檔案上傳、下載下傳