天天看點

用FtpClient實作的FTP全目錄下載下傳

FTP資料上傳下載下傳用到的開發包是commons-net-1.4.1.jar

現在本機上配置一個ftp伺服器目錄,配置完成後的參數資訊:

final static String HOST="172.20.16.76";    //本機ip位址
	final static int PORT=9500;                 //FTP端口号
	final static String USERNAME="lyc";         //FTP使用者名
	final static String PASSWORD="123456";      //FTP登入密碼
	final static String LOCAL_DIRECTORY="E:/delphi7Project/ftpDownload";  //下載下傳到本地時目錄
           

檢索FTP全目錄,然後遞歸循環下載下傳檔案

public static void doDownload(String path) throws IOException{
	//建立本地目錄
	makeDirs(path);
	//切換工作目錄
	ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
	//擷取目錄下的檔案清單
        String[] fileNames = ftpClient.listNames(); 
        //循環下載下傳FTP目錄下的檔案
        for(String fname:fileNames){
        	if(isDirectory(path+"/"+fname)){
        		//遞歸調用
        		doDownload(path+"/"+fname);
        	}else{
        		//下載下傳單個檔案
        		downloadFile(path+"/"+fname);
        	}
        }
}
           

全文代碼如下:

package com.test;

import org.apache.commons.net.ftp.FTPClient;

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

import javax.swing.JFileChooser; 
import javax.swing.SwingUtilities;
import javax.swing.UIManager;


public class FtpTest {
	static FTPClient ftpClient;
<pre name="code" class="java">	final static String HOST="172.20.16.76";
	final static int PORT=9500;
	final static String USERNAME="lyc";
	final static String PASSWORD="123456";
	final static String LOCAL_DIRECTORY="E:/delphi7Project/ftpDownload";
	
	public static void login() throws SocketException, IOException{
		ftpClient = new FTPClient();
		ftpClient.connect(HOST,PORT);
		ftpClient.login(USERNAME, PASSWORD);
		//設定編碼
        ftpClient.setControlEncoding("GBK");
        ftpClient.setBufferSize(8096);
	}
	//判斷給定的路徑是檔案還是檔案夾
	public static boolean isDirectory(String path) throws IOException{
		//如果是檔案,就會傳回false
		//如果檔案夾或檔案名中含有中文,這裡要轉換一下,不然會傳回false
		return ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
	}
	
	//判斷本地路徑是否存在,不存在就建立路徑
	public static void makeDirs(String path){
		File localFile = new File(LOCAL_DIRECTORY+path);
		if(!localFile.exists()){
			localFile.mkdirs();
		}
	}
	
	//下載下傳單個檔案
	public static void downloadFile(String dir) throws IOException{
        File file = new File(LOCAL_DIRECTORY + dir);      
        OutputStream os = new FileOutputStream(file);  
        ftpClient.setControlEncoding("GBK");
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        //如果檔案名中含有中文,retrieveFile檔案時會找不到FTP上的檔案,導緻儲存在本地的是一個空檔案,是以也要轉換一下
        ftpClient.retrieveFile(new String(file.getName().getBytes(),"ISO-8859-1"), os);
        os.close();
	}
	
	//下載下傳任務,遞歸調用,循環下載下傳所有目錄下的檔案
	public static void doDownload(String path) throws IOException{
		//建立本地目錄
		makeDirs(path);
		//切換工作目錄
		ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
		//擷取目錄下的檔案清單
        String[] fileNames = ftpClient.listNames(); 
        //循環下載下傳FTP目錄下的檔案
        for(String fname:fileNames){
        	if(isDirectory(path+"/"+fname)){
        		//遞歸調用
        		doDownload(path+"/"+fname);
        	}else{
        		//下載下傳單個檔案
        		downloadFile(path+"/"+fname);
        	}
        }
	}
	
	//實時同步ftp目錄檔案到本地
	public static class MyRun implements Runnable{
		@Override
		public void run() {
			while(true){
				try {
					Thread.sleep(10*1000);
					doDownload("/");
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
		}
	}
    public static void main(String[] args) throws SocketException, IOException {
    	//連接配接FTP伺服器
    	login();
    	//全目錄下載下傳
    	MyRun myRun = new MyRun();
    	new Thread(myRun).start();
    	//testUpload();
    } 

     // FTP上傳檔案    
    public static void testUpload() {
        FTPClient ftpClient = new FTPClient();
        FileInputStream fis = null;

        try {
            ftpClient.connect("172.20.16.76",9500);
            ftpClient.login("lyc", "123456");

            JFileChooser fd = new JFileChooser();  
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            } 
            catch (Exception e) {
                e.printStackTrace();
            }
            SwingUtilities.updateComponentTreeUI(fd);           
            fd.showOpenDialog(null);  
            File srcFile = fd.getSelectedFile();  
            //if(srcFile != null){}              
            
            fis = new FileInputStream(srcFile);
            //設定上傳目錄
            ftpClient.changeWorkingDirectory("/img");
            //ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            //設定檔案類型(二進制)
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.storeFile(srcFile.getName(), fis);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("FTP用戶端出錯!", e);
        } finally {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("關閉FTP連接配接發生異常!", e);
            }
        }
    }

}