久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

使用遞歸方法實現(xiàn),向FTP服務(wù)器上傳整個目錄結(jié)構(gòu),、從FTP服務(wù)器下載整個目錄到本地的功能

 筱肆 2015-01-29

我最近由于在做一個關(guān)于FTP文件上傳和下載的功能時候,,發(fā)現(xiàn)Apache FTP jar包沒有提供對整個目錄結(jié)構(gòu)的上傳和下載功能,只能非目錄類型的文件進行上傳和下載操作,,后來我查閱很多網(wǎng)上的實現(xiàn)方法,,再結(jié)合自己的理解、以及符合自己的需求,,完成了我自己的apache FTP jar包補充類,。

上面是背景,基本敘述完畢,,下面開始介紹實現(xiàn)方法和代碼,。


一。環(huán)境搭建:

1.使用的FileZilla Server開源免費軟件,,安裝過后建立的本地FTP服務(wù)器。

2.使用的apache上下載FTP工具包,,引用到工程目錄中,。

3.IDE,Eclipse,,JDK6

二,。介紹代碼。

上傳和下載目錄的實現(xiàn)原理:對每一個層級的目錄進行判斷,,是為目錄類型,、還是文件類型,。

如果為目錄類型,采用遞歸調(diào)用方法,,檢查到最底層的目錄為止結(jié)束,。

如果為文件類型,則調(diào)用上傳或者下載方法對文件進行上傳或者下載操作,。

貼出代碼:(其中有些沒有代碼,,可以看看,還是很有用處的)



  1. package com.ftp;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.net.SocketException;  
  10.   
  11. import org.apache.commons.net.ftp.FTP;  
  12. import org.apache.commons.net.ftp.FTPClient;  
  13. import org.apache.commons.net.ftp.FTPClientConfig;  
  14. import org.apache.commons.net.ftp.FTPFile;  
  15. import org.apache.commons.net.ftp.FTPReply;  
  16.   
  17. public class RemoteFtpProcess extends FTPClient {  
  18.     private static FTPClient ftpClient = new FTPClient();  
  19.   
  20.     /** 
  21.      * 本方法用戶登錄遠(yuǎn)程的FTP服務(wù)器 
  22.      *  
  23.      * @param url :表示FTP的IP地址 
  24.      * @param port :FTP服務(wù)器端口,,默認(rèn)端口為21 
  25.      * @param userName :登錄FTP的用戶名 
  26.      * @param password :登錄FTP的密碼 
  27.      *  
  28.      * @return FTPClient:返回為FTPClient對象 
  29.      */  
  30.     public FTPClient loginFtp(String url, int port, String userName,  
  31.             String password) {  
  32.         try {  
  33.             ftpClient.connect(url, port);  
  34.             ftpClient.setControlEncoding("UTF-8");  
  35.             FTPClientConfig ftpConfig = new FTPClientConfig(FTPClientConfig.SYST_NT);  
  36.             ftpConfig.setServerLanguageCode("zh");  
  37.             ftpClient.login(userName, password);  
  38.             int reply = 0;  
  39.             reply = ftpClient.getReplyCode();  
  40.             System.out.println(reply);  
  41.             if (FTPReply.isPositiveCompletion(reply)) {  
  42.                 System.out.println("登錄成功,!");  
  43.             } else {  
  44.                 System.out.println("登錄失敗,!");  
  45.             }  
  46.         } catch (SocketException e) {  
  47.             e.printStackTrace();  
  48.         } catch (IOException e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.         return ftpClient;  
  52.     }  
  53.   
  54.     /** 
  55.      * @param ftpc :退出FTP登錄 
  56.      * @return boolean :是否已經(jīng)關(guān)閉連接 
  57.      *  
  58.      * @throws IOException 
  59.      */  
  60.     public static boolean closeConnections(FTPClient ftpc) throws IOException {  
  61.         boolean bool = false;  
  62.         ftpc.logout();  
  63.         return bool;  
  64.     }  
  65.   
  66.     /** 
  67.      * 方法用于上傳文件到FTP服務(wù)器的指定文件夾中 
  68.      *  
  69.      * @param fileName :上傳文件的名稱 
  70.      * @param input :上傳文件的輸入流對象 
  71.      * @param toFtpPath :上傳到FTP的目的路徑 
  72.      *  
  73.      * @return boolean:表示上傳是否成功 
  74.      *  
  75.      */  
  76.     public boolean uploadFileToFtp(String fileName, InputStream input,  
  77.             String toFtpPath) {  
  78.         boolean bool = false;  
  79.         try {  
  80.             // 使得能夠處理中文編碼  
  81.             fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");  
  82.             toFtpPath = new String(toFtpPath.getBytes("GBK"), "ISO-8859-1");  
  83.             // 轉(zhuǎn)到上傳文件的FTP目錄中  
  84.             ftpClient.changeWorkingDirectory(toFtpPath);  
  85.             // 設(shè)置處理文件的類型為字節(jié)流的形式  
  86.             ftpClient.setFileType(FTP.BINARY_FILE_TYPE);  
  87.             // 如果缺省該句 傳輸txt正常 但圖片和其他格式的文件傳輸出現(xiàn)亂碼  
  88.             ftpClient.storeFile(fileName, input);  
  89.             input.close();  
  90.             bool = true;  
  91.         } catch (IOException e) {  
  92.             bool = false;  
  93.             e.printStackTrace();  
  94.         }   
  95.         return bool;  
  96.     }  
  97.   
  98.     /** 
  99.      * 方法用于從FTP服務(wù)器中下載文件 
  100.      *  
  101.      * @param ftpUrl :下載文件所處FTP中路徑 
  102.      * @param fileName :下載的文件名稱 
  103.      * @param outputSream :下載文件的輸出流對象 
  104.      *  
  105.      * @return boolean :表示是否上傳成功 
  106.      *  
  107.      */  
  108.     public boolean downloadFileFromFtp(String ftpUrl, String fileName,  
  109.             OutputStream outputStream) {  
  110.         boolean bool = false;  
  111.         try {  
  112.             ftpClient.changeWorkingDirectory(ftpUrl);  
  113.             FTPFile[] ftpFile = ftpClient.listFiles();  
  114.             for (int i = 0; i < ftpFile.length; i++) {  
  115.                 if (fileName.equals(ftpFile[i].getName())) {  
  116.                     ftpClient.retrieveFile(new String(ftpFile[i].getName()  
  117.                             .getBytes("GBK"), "ISO-8859-1"), outputStream);  
  118.                     outputStream.flush();  
  119.                     outputStream.close();  
  120.                 }  
  121.             }  
  122.             bool = true;  
  123.         } catch (IOException e) {  
  124.             e.printStackTrace();  
  125.             bool = false;  
  126.         }  
  127.         return bool;  
  128.     }  
  129.   
  130.     /** 
  131.      * 方法用戶刪除FTP上的指定的文件 
  132.      *  
  133.      * @param fileUrl :文件在FTP中的路徑 
  134.      * @param fileName :文件的名稱 
  135.      *  
  136.      * @return boolean:刪除是否成功 
  137.      */  
  138.     public boolean deleteFileOnFtp(String fileUrl, String fileName) {  
  139.         boolean bool = false;  
  140.         try {  
  141.             ftpClient.changeWorkingDirectory(fileUrl);  
  142.             FTPFile[] ftpFiles = ftpClient.listFiles();  
  143.             System.out.println(ftpFiles.length);  
  144.             for (int i = 0; i < ftpFiles.length; i++) {  
  145.                 if (fileName.equals(ftpFiles[i].getName())) {  
  146.                     ftpClient.deleteFile(fileName);  
  147.                 }  
  148.             }  
  149.         } catch (IOException e) {  
  150.             e.printStackTrace();  
  151.         }  
  152.         return bool;  
  153.     }  
  154.   
  155.     /** 
  156.      * 判斷指定文件中是否存在相同名稱的文件 
  157.      *  
  158.      * @param remotePath :FTP上的遠(yuǎn)程目錄 
  159.      * @param fileName:文件名稱 
  160.      * @return boolean :判斷是否存在相同名稱 
  161.      *  
  162.      */  
  163.     public boolean isSameName(String remotePath, String fileName) {  
  164.         boolean bool = false;  
  165.         try {  
  166.             FTPFile[] ftpFiles = ftpClient.listFiles();  
  167.             System.out.println(ftpFiles.length);  
  168.             ftpClient.changeWorkingDirectory(remotePath);  
  169.             for (int i = 0; i < ftpFiles.length; i++) {  
  170.                 if (fileName.equals(ftpFiles[i].getName())) {  
  171.                     System.out.println("存在和指定文件相同名稱的文件");  
  172.                     bool = true;  
  173.                 } else {  
  174.                     bool = false;  
  175.                 }  
  176.             }  
  177.         } catch (Exception e) {  
  178.             bool = false;  
  179.         }  
  180.         return bool;  
  181.     }  
  182.   
  183.     /** 
  184.      * 更改文件名稱 
  185.      *  
  186.      */  
  187.     public String changeName(String remotePath, String fileName, String newName) {  
  188.         if (isSameName(remotePath, fileName)) {  
  189.             fileName = fileName + "." + newName;  
  190.         }  
  191.         return fileName;  
  192.     }  
  193.       
  194.       
  195.     public static void newFileOnFTP(String pathName){  
  196.         try {  
  197.             ftpClient.mkd(pathName);  
  198.         } catch (IOException e) {  
  199.             e.printStackTrace();  
  200.         }  
  201.     }  
  202.       
  203.     //上傳整個目錄到FTP的指定目錄中  
  204.     public void uploadDirFiles(String dirPath,String toRemotePath) throws IOException{  
  205.         if (dirPath!=null && !dirPath.equals("")) {  
  206.             //建立上傳目錄的File對象  
  207.             File dirFile = new File(dirPath);  
  208.             //判斷File對象是否為目錄類型  
  209.             if (dirFile.isDirectory()) {  
  210.                 //如果是目錄類型,。  
  211.                 //在FTP上創(chuàng)建一個和File對象文件相同名稱的文件夾  
  212.                 ftpClient.makeDirectory(toRemotePath+"http://"+dirFile.getName());  
  213.                 //獲得File對象中包含的子目錄數(shù)組  
  214.                 File[] subFiles = dirFile.listFiles();  
  215.                 //路徑  
  216.                 String path = toRemotePath+"http://"+dirFile.getName();  
  217.                 System.out.println(path);  
  218.                 //判斷數(shù)組是否為空  
  219.                 if (subFiles!=null && subFiles.length>0) {  
  220.                     //遍歷整個File數(shù)組  
  221.                     for (int i = 0; i < subFiles.length; i++) {  
  222.                         //判斷是否為目錄類型  
  223.                         if (subFiles[i].isDirectory()) {  
  224.                             //如果為目錄類型  
  225.                             //跳轉(zhuǎn)到FTP的根目錄層級  
  226.                             ftpClient.changeWorkingDirectory("http://");  
  227.                             //在FTP上建立相同的目錄名稱  
  228.                             ftpClient.makeDirectory(path+"http://"+subFiles[i].getName());  
  229.                             //遞歸調(diào)用自身方法,進行到下一層級的目錄循環(huán)  
  230.                             uploadDirFiles(subFiles[i].getAbsolutePath(), path);  
  231.                         } else {  
  232.                             //如果為文件類型  
  233.                             //建立一個文件輸出流對象  
  234.                             FileInputStream input = new FileInputStream(subFiles[i]);  
  235.                             //調(diào)用文件上傳方法,,將文件上傳到FTP上  
  236.                             uploadFileToFtp(subFiles[i].getName(), input, path+"http://");  
  237.                             //關(guān)閉文件輸入流  
  238.                             input.close();  
  239.                         }  
  240.                     }  
  241.                 }  
  242.             } else {  
  243.                 //如果為文件類型  
  244.                 //建立一個文件輸出流對象  
  245.                 FileInputStream input = new FileInputStream(dirFile);  
  246.                 //調(diào)用文件上傳方法,,將文件上傳到FTP上  
  247.                 uploadFileToFtp(dirFile.getName(), input, toRemotePath);  
  248.                 //關(guān)閉文件輸入流  
  249.                 input.close();  
  250.             }  
  251.         }  
  252.     }  
  253.       
  254.     //本方法用于下載FTP上的目錄結(jié)構(gòu)到本地中  
  255.     public void downloadDirFiles(String remotePath,String localPath,String fileName) throws IOException{  
  256.         if (remotePath!=null && !remotePath.equals("")) {  
  257.             //在本地建立一個相同的文件目錄  
  258.             File localFile = new File(localPath+"\\"+fileName);  
  259.             localFile.mkdirs();  
  260.             //獲得目錄在本地的絕對路徑  
  261.             localPath = localFile.getAbsolutePath();  
  262.             System.out.println(localPath);  
  263.             //獲得FTPFile對象數(shù)組  
  264.             FTPFile[] ftpFiles = ftpClient.listFiles(new String(remotePath.getBytes("GBK"),"ISO-8859-1"));  
  265.             if (ftpFiles!=null && ftpFiles.length>0) {  
  266.                 for (int i = 0; i < ftpFiles.length; i++) {  
  267.                     FTPFile subFile = ftpFiles[i];  
  268.                     //判斷是否為目錄結(jié)構(gòu)  
  269.                     if (subFile.isDirectory()) {  
  270.                         //如果為目錄結(jié)構(gòu)  
  271.                         //調(diào)用自身方法,進行下一層級目錄循環(huán)  
  272.                         downloadDirFiles(remotePath+"http://"+subFile.getName(), localPath, subFile.getName());  
  273.                     } else {  
  274.                         //如果不為目錄結(jié)構(gòu),為文件類型  
  275.                         FileOutputStream outputStream = new FileOutputStream(new File(localPath+"\\"+subFile.getName()));  
  276.                         //調(diào)用下載方法對文件進行下載  
  277.                         downloadFileFromFtp(remotePath, subFile.getName(), outputStream);  
  278.                         //關(guān)閉文件輸出流  
  279.                         outputStream.close();  
  280.                     }  
  281.                 }  
  282.             }  
  283.         }  
  284.     }  
  285. }  



編寫一個測試main類,,進行測試,。

  1. package com.ftp;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.commons.net.ftp.FTPClient;  
  6.   
  7. public class TestMain {  
  8.     public static void upload(){  
  9.         RemoteFtpProcess remote = new RemoteFtpProcess();  
  10.         FTPClient ftpClient = remote.loginFtp("127.0.0.1", 21, "root", "root");  
  11.         try {  
  12.             remote.uploadDirFiles("D:\\FTPTestA", "http://");  
  13.         } catch (IOException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17.       
  18.     public static void download(){  
  19.         RemoteFtpProcess remote = new RemoteFtpProcess();  
  20.         FTPClient ftpClient = remote.loginFtp("127.0.0.1", 21, "root", "root");  
  21.         try {  
  22.             remote.downloadDirFiles("\\FTPTest", "E://", "FTPTestB  
  23. ");  
  24.         } catch (IOException e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28.       
  29.     public static void main(String[] args) {  
  30.         download();  
  31.     }  
  32. }  


有什么更好地建議或者方法,請直接評論回答,。

===============Over========================



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多