Java操作FTP工具類(實例詳解)


 

這里使用Apache的FTP jar 包

沒有使用Java自帶的FTPjar包

 

 工具類

 

package com.zit.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.Properties;

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;

import com.zit.adapter.camera.CameraListener;


public class FTPUtil {

    private static Logger logger = Logger.getLogger(FTPUtil.class);
    
    private static String classPath=CameraListener.class.getResource("/").getPath();
    private static String filesPath = classPath.substring(0, classPath.indexOf("WEB-INF")) + "file" ;
    
    private FTPClient ftpClient;
    //從本地文件獲取各種屬性
    private static String ftpIP=FTPConfig.getFTPHost();
    private static Integer ftpPort=Integer.valueOf(FTPConfig.getFTPPort());
    private static String ftpUserName=FTPConfig.getUserName();
    private static String ftpPassword=FTPConfig.getPassword();
    private static String ftpEncode = FTPConfig.getFTPEncode();
    private static String localPath=FTPConfig.getLocalFilePath();
    
    public FTPUtil() {
        
    }
    
    public synchronized boolean connectServer() {
        ftpClient = new FTPClient();
        ftpClient.setControlEncoding(ftpEncode);//解決上傳文件時文件名亂碼
        int reply = 0 ;
        try {
            // 連接至服務器
            ftpClient.connect(ftpIP,ftpPort);
            // 登錄服務器
            ftpClient.login(ftpUserName, ftpPassword);
            //登陸成功,返回碼是230
            reply = ftpClient.getReplyCode();
            // 判斷返回碼是否合法
            if(!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                return false;
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return true;
    }
    
    //判斷ftp服務器文件是否存在    
    public boolean existFile(String path)  {
        boolean flag = false;
        FTPFile[] ftpFileArr;
        try {
            ftpFileArr = ftpClient.listFiles(path);
            if (ftpFileArr.length > 0) {
                flag = true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }
    
    //刪除ftp文件
    public synchronized boolean deleteFile(String pathname, String filename){ 
        boolean flag = false; 
        try { 
            System.out.println("開始刪除文件");
            //切換FTP目錄 
            ftpClient.changeWorkingDirectory(pathname); 
            ftpClient.dele(filename); 
            ftpClient.logout();
            flag = true; 
            System.out.println("刪除文件成功");
        } catch (Exception e) { 
            System.out.println("刪除文件失敗");
            e.printStackTrace(); 
        } finally {
            if(ftpClient.isConnected()){ 
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            } 
        }
        return flag; 
    }
    
    //從FTP server下載到本地文件夾
    public synchronized boolean download(String path){
        boolean flag = false;
        FTPFile[] fs=null;
        try {
            fs = ftpClient.listFiles("aaa");
            if(fs.length<0) {
                return flag;
            }
            //1、遍歷FTP路徑下所有文件
            for(FTPFile file:fs){
                
//                File localFile = new File(localPath+"/"+file.getName());
                //2、保存到本地
                OutputStream os = new FileOutputStream(localFile);
                //retrieveFile(FTP服務端的源路徑),這個路徑要和listFiles的路徑一致
                ftpClient.retrieveFile("aaa/" + file.getName(), os);
                //3、刪除FTP中的上面保存的文件
                //循環外關閉,讀一個關閉一次挺慢的
                is.flush();
                is.close();
            }
            flag = true;
        } catch (IOException e) {
            e.printStackTrace();
        }  
        return flag;
    }

    
    
    
    public synchronized boolean upload(InputStream inputStream , String fileName , String path) {
        try {
             
            //切換工作路徑,設置上傳的路徑 
            ftpClient.changeWorkingDirectory(path);
            //設置1M緩沖
             ftpClient.setBufferSize(1024);
             // 設置被動模式
             ftpClient.enterLocalPassiveMode();
             // 設置以二進制方式傳輸
             ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
             /*
              * 第一個參數:服務器端文檔名 
              * 第二個參數:上傳文檔的inputStream 
              * 在前面設置好路徑,緩沖,編碼,文件類型后,開始上傳
              */
             ftpClient.storeFile(fileName, inputStream);
            inputStream.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            closeClient();
        }
         
    }
    
    public boolean checkSubfolder(String path, String subfolderName) {
        try {
            //切換到FTP根目錄
            ftpClient.changeWorkingDirectory(path);
            //查看根目錄下是否存在該文件夾
            InputStream is = ftpClient.retrieveFileStream(new String(subfolderName.getBytes("UTF-8")));
            if (is == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE) {
                //若不存在該文件夾,則創建文件夾
                return createSubfolder(path,subfolderName);
            }
            if (is != null) {
                is.close();
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
    public synchronized boolean createSubfolder(String path,String subfolderName){
        try {
            ftpClient.changeWorkingDirectory(path);
            ftpClient.makeDirectory(subfolderName);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
    
    
    /**
     * 斷開與遠程服務器的連接
     */
    public void closeClient(){
        if (ftpClient != null && ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
    
}

 

 

測試類:

package com.zit.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import com.zit.util.FTPUtil;

public class TestFTP {

    public static void main(String[] args) {
        
        FTPUtil ftpClient = new FTPUtil();
        ftpClient.connectServer();
        
        try {
            File file = new File("D:\\test.doc");
            InputStream stream = new FileInputStream(file);
            String ftpPath = "D:\\FTP";
            String fileName = "文件夾";
            boolean b = ftpClient.checkSubfolder(ftpPath, fileName);
            if(stream != null && b) {
                ftpClient.upload(stream, "aaa.doc", fileName);
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        
        
        
    }
}

 

實驗工具:

filezilla server(FTP服務端工具)

官網下載即可

 

步驟

點擊左上角小頭像

1、Add新增用戶,輸入用戶名

2、輸入密碼

3、Share folders 共享文件夾,就是設置FTP根目錄

4、Add選擇共享文件夾,在本地某文件夾即可

5、勾選該文件夾用戶的權限,都選上

6、點擊OK即可

 

 

 

 

 

 

實驗結果:

運行測試類,即可看到,我已經把某個文檔,上傳到FTP根目錄下了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM