1. 程式人生 > >Java實現FTP伺服器上傳、下載、下載多個寫入本地、刪除

Java實現FTP伺服器上傳、下載、下載多個寫入本地、刪除

場景:需要從FTP伺服器一個檔案目錄下down下來所有的檔案,上傳到專案某個目錄下。

上傳下載刪除獲取檔案下所有檔案,順便加上獲取到所有檔案進行下載。

package a1;  
/**
 *  1----public boolean uploadFile(String path ,File localFile,String fileNewName);   上傳檔案  path  檔案存入FTP 的路徑, 
 *                        localFile  檔案在本地的路徑,fileNewName 檔案上傳FTP後名字  
 *                        
 *  2----public boolean downloadFileq(String path,String ftpName,File localFile);檔案下載   @param ftpName  ftp上的檔名 , localFile  儲存的本地地址 
 *                        path ftp上的檔案路徑
 *                        
 *  3----public boolean deleteFile(String path,String ftpName); 檔案刪除   path  ftp上的檔案路徑  
 *     
 *  4----public boolean findFile(String pathName,String  judge); 獲取指定資料夾下的檔案目錄    pathName  需要獲取資料夾下文家目錄的資料夾路徑 , 
 *  				judge  是否進行下級資料夾遍歷,"Y"選擇遍歷   "N"選擇不遍歷           
 * @author Dell
 *
 */ 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;

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

import com.alibaba.fastjson.JSONObject;


public class FTPUtil {  
    
    public static String ftpHost;  
    public static int port;  
    public static String userName;  
    public static String passWord;  
    public static String ftpEncode; 
    public static int defaultTimeout;  
    /** 
     * 靜態塊,初始化ftp資料 
     */  
    static{  
        try{  
            ftpHost = "130.1.10.10";
            port = 21;            
            userName = "
[email protected]
@130.1.11.248"; passWord = "q1w2e3r4"; ftpEncode="UTF-8"; defaultTimeout = 30000; }catch(Exception e){ e.printStackTrace(); } } /** * 上傳ftp * @param path 檔案存入FTP 的路徑 * @param localFile 檔案在本地的路徑 * @param fileNewName 檔案上傳FTP後名字 * @return 成功返回true 失敗返回false * @throws SocketException * @throws IOException */ public String uploadFile(String path ,File localFile,String fileNewName) { boolean flag=true; //獲得檔案流 FileInputStream is; try { is = new FileInputStream(localFile); //儲存至Ftp FTPClient ftpClient = new FTPClient();// ftpHost為FTP伺服器的IP地址,port為FTP伺服器的登陸埠,ftpHost為String型,port為int型。 ftpClient.setControlEncoding(ftpEncode); // 中文支援 ftpClient.connect(ftpHost); ftpClient.login(userName, passWord);// userName、passWord分別為FTP伺服器的登陸使用者名稱和密碼 ftpClient.setDefaultPort(port); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); // 用被動模式傳輸,解決linux服務長時間等待,導致超時問題 ftpClient.setDefaultTimeout(defaultTimeout);// 設定預設超時時間 ftpClient.setBufferSize(1024*1024);//設定快取區,預設緩衝區大小是1024,也就是1K //切換目錄,目錄不存在建立目錄 boolean chagenDirFlag=ftpClient.changeWorkingDirectory(path); if(chagenDirFlag==false){ ftpClient.makeDirectory(path); ftpClient.changeWorkingDirectory(path); } //上傳至Ftp flag=ftpClient.storeFile(fileNewName, is); is.close(); //關閉連線 ftpClient.logout(); ftpClient.disconnect(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block return "FileNotFound"; } catch (SocketException e) { // TODO Auto-generated catch block return "SocketNotSuccess"; } catch (IOException e) { // TODO Auto-generated catch block return "SocketNotSuccess"; } return "SUCCESS"; } /** * 下載FTP * @param ftpName ftp上的檔名 * @param localFile 儲存的本地地址 * @param path ftp上的檔案路徑 * @return 成功返回true 失敗返回false * @throws SocketException * @throws IOException */ public String downloadFileq(String path,String ftpName,File localFile) { boolean flag=true; //儲存至Ftp FTPClient ftpClient = new FTPClient();// ftpHost為FTP伺服器的IP地址,port為FTP伺服器的登陸埠,ftpHost為String型,port為int型。 ftpClient.setControlEncoding(ftpEncode); // 中文支援 try { ftpClient.connect(ftpHost); ftpClient.login(userName, passWord);// userName、passWord分別為FTP伺服器的登陸使用者名稱和密碼 ftpClient.setDefaultPort(port); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); // 用被動模式傳輸,解決linux服務長時間等待,導致超時問題 ftpClient.setDefaultTimeout(defaultTimeout);// 設定預設超時時間 ftpClient.setBufferSize(1024*1024);//設定快取區,預設緩衝區大小是1024,也就是1K //切換目錄,目錄不存在建立目錄 ftpClient.changeWorkingDirectory(path); OutputStream os = new FileOutputStream(localFile); flag = ftpClient.retrieveFile(ftpName, os); //關閉流 os.flush(); os.close(); //關閉連線 ftpClient.logout(); ftpClient.disconnect(); System.out.println("FTP檔名——"+ftpName); } catch (SocketException e) { return "SocketNotSuccess"; } catch (IOException e) { return "SocketNotSuccess"; } return "SUCCESS"; } /** * 刪除FTP * @param ftpName ftp上的檔名 * @param path ftp上的檔案路徑 * @return 成功返回true 失敗返回false * @throws SocketException * @throws IOException */ public String deleteFile(String path,String ftpName) { boolean flag=true; //儲存至Ftp FTPClient ftpClient = new FTPClient();// ftpHost為FTP伺服器的IP地址,port為FTP伺服器的登陸埠,ftpHost為String型,port為int型。 ftpClient.setControlEncoding(ftpEncode); // 中文支援 try { ftpClient.connect(ftpHost); ftpClient.login(userName, passWord);// userName、passWord分別為FTP伺服器的登陸使用者名稱和密碼 ftpClient.setDefaultPort(port); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); // 用被動模式傳輸,解決linux服務長時間等待,導致超時問題 ftpClient.setDefaultTimeout(defaultTimeout);// 設定預設超時時間 //切換目錄,目錄不存在建立目錄 ftpClient.changeWorkingDirectory(path); flag = ftpClient.deleteFile(ftpName); //關閉連線 ftpClient.logout(); ftpClient.disconnect(); } catch (SocketException e) { return "SocketNotSuccess"; } catch (IOException e) { return "SocketNotSuccess"; } return "SUCCESS"; } /** * 查詢指定目錄下的檔名 * @pathName path ftp上的檔案路徑 * @pathName judge 是否進行下級資料夾遍歷 "Y"選擇遍歷 "N"選擇不遍歷 * @return JSONObject 檔案目錄 * @throws SocketException * @throws IOException */ public JSONObject findFile(String pathName,String judge) { JSONObject json = new JSONObject(); //儲存至Ftp FTPClient ftpClient = new FTPClient();// ftpHost為FTP伺服器的IP地址,port為FTP伺服器的登陸埠,ftpHost為String型,port為int型。 ftpClient.setControlEncoding(ftpEncode); // 中文支援 try { ftpClient.connect(ftpHost); ftpClient.login(userName, passWord);// userName、passWord分別為FTP伺服器的登陸使用者名稱和密碼 ftpClient.setDefaultPort(port); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); // 用被動模式傳輸,解決linux服務長時間等待,導致超時問題 ftpClient.setDefaultTimeout(defaultTimeout);// 設定預設超時時間 //遍歷方法 List<String> res = new ArrayList<String>(); res= List( pathName,ftpClient,judge); json.put("json", res); //關閉連線 ftpClient.logout(); ftpClient.disconnect(); } catch (SocketException e) { json.put("Result", "SocketNotSuccess"); } catch (IOException e) { json.put("Result", "SocketNotSuccess"); } return json; } /** * 遞迴遍歷出目錄下面所有檔案 * @param pathName 需要遍歷的目錄,必須以"/"開始和結束 * @return List<String> * @throws IOException */ List<String> arFiles = new ArrayList<String>(); public List<String> List(String pathName,FTPClient ftpClient,String judge){ if(pathName.startsWith("/")&&pathName.endsWith("/")){ String directory = pathName; //更換目錄到當前目錄 try { ftpClient.changeWorkingDirectory(directory); FTPFile[] files = ftpClient.listFiles(); //遍歷資料夾下所有檔案 for(FTPFile file:files){ if(file.isFile()){ //如果是檔案 arFiles.add(directory+file.getName()); //如果是資料夾並且擁有查詢標示 }else if(file.isDirectory()&&judge.equals("Y")){ List(directory+file.getName()+"/",ftpClient,judge); }else if(file.isDirectory()&&judge.equals("N")){ continue; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return arFiles; } /** * 遞迴遍歷出目錄下面所有檔案放入指定目錄 * @param pathName 需要遍歷的目錄,必須以"/"開始和結束 * @return List<String> * @throws IOException */ public void List(String pathName,FTPClient ftpClient,String judge){ InputStream in = null; if(pathName.startsWith("/")&&pathName.endsWith("/")){ String directory = pathName; //更換目錄到當前目錄 try { ftpClient.changeWorkingDirectory(directory); FTPFile[] files = ftpClient.listFiles(); //遍歷資料夾下所有檔案 for(FTPFile file:files){ if(file.isFile()){ //如果是檔案 String remoteAbsoluteFile = file.getName(); remoteAbsoluteFile = new String(remoteAbsoluteFile.getBytes("UTF-8"), "ISO-8859-1"); in = ftpClient.retrieveFileStream(remoteAbsoluteFile); byteToFile(in, "D:/tomcat/apache-tomcat-7.0.85/webapps/service-app/fenci/"+remoteAbsoluteFile); System.out.println("下載成功!" + remoteAbsoluteFile); in.close(); ftpClient.completePendingCommand(); //如果是資料夾並且擁有查詢標示 }else if(file.isDirectory()&&judge.equals("Y")){ List(directory+file.getName()+"/",ftpClient,judge); }else if(file.isDirectory()&&judge.equals("N")){ continue; } } } catch (IOException e) { e.printStackTrace(); }finally{ in.close(); } } } /** * byte[] 轉 file * * @param bytes * @param path */ public static void byteToFile(InputStream inStream, String path) { try { // 輸出流InputStream inStream File localFile = new File(path); if(!localFile.exists()){ if(!localFile.getParentFile().exists()) { localFile.getParentFile().mkdir(); } localFile.createNewFile(); } OutputStream outStream = new FileOutputStream(localFile); byte[] b = new byte[1024]; int len = -1; while((len=inStream.read(b)) != -1){ outStream.write(b, 0, len); } outStream.flush(); inStream.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { FTPUtil util = new FTPUtil(); //上傳測試 File localFile=new File("D:/testFTP/20170915.csv"); String path = "/root/update/"; String flag=util.uploadFile(path,localFile, "20170915.csv"); System.out.println(flag +" 判斷上傳結果"); //下載測試 File localFile=new File("D:/testFTP/15.csv"); localFile.createNewFile(); String flag=util.downloadFileq("/root/update/","20170915.csv",localFile); System.out.println(flag +" 判斷下載結果"); //刪除測試 String flag=util.deleteFile("/root/update/","1.jpg"); System.out.println(flag +" 判斷刪除結果"); //獲取測試 JSONObject json=util.findFile("/root/update/","Y"); System.out.println(json.toJSONString() +" 資料夾下目錄"); } }