ftp下載文件


  1 import org.apache.commons.net.ftp.FTP;
  2 import org.apache.commons.net.ftp.FTPClient;
  3 import org.apache.commons.net.ftp.FTPFile;
  4 import org.apache.commons.net.ftp.FTPReply;
  5 import org.slf4j.Logger;
  6 import org.slf4j.LoggerFactory;
  7 import org.springframework.beans.factory.annotation.Value;
  8 
  9 import java.io.File;
 10 import java.io.FileOutputStream;
 11 import java.io.IOException;
 12 import java.io.OutputStream;
 13 
 14 public class FtpUtil {
 15 
 16     private static final Logger logger= LoggerFactory.getLogger(FtpUtil.class);
 17     //ftp服務器地址
 18     @Value("${ftp.hostname}")
 19     public String hostname;
 20     //ftp服務器端口號
 21     @Value("${ftp.port}")
 22     public String port;
 23     //ftp登錄賬號
 24     @Value("${ftp.username}")
 25     public String username;
 26     //ftp登錄密碼
 27     @Value("${ftp.password}")
 28     public String password;
 29     private FTPClient ftpClient = null;
 30     private OutputStream os = null;
 31     /**
 32      * FTP下載文件
 33      * @param pathname 目標文件目錄路徑
 34      * @param filename 文件名稱(帶后綴)
 35      * @param localpath 本地存放路徑
 36      * @return
 37      */
 38     public boolean downloadFile(String pathname, String filename, String localpath) {
 39         boolean flag = false;
 40         try {
 41             LOGGER.info("開始下載文件");
 42             getFtpClient();
 43             // ftpClient.enterLocalActiveMode();// 主動模式
 44             ftpClient.enterLocalPassiveMode();// 被動模式
 45             ftpClient.changeWorkingDirectory(pathname);
 46             //讀取文件
       FTPFile[] ftpFiles = ftpClient.listFiles(); 48 for(FTPFile file : ftpFiles) { 49 if (filename.equalsIgnoreCase(file.getName())) { 50 File localFile = new File(localpath); 51 if (!localFile.exists()){ 52 localFile.mkdirs(); 53 } 54 localFile = new File(localpath + File.separator + file.getName()); 55 os = new FileOutputStream(localFile); 56 ftpClient.retrieveFile(file.getName(), os); 57 os.close(); 58 } 59 } 60 ftpClient.logout(); 61 flag = true; 62 logger.info("下載文件成功"); 63 } catch (Exception e) { 64 logger.info("下載文件失敗,失敗原因:" + e.getMessage(), e); 65 } finally { 66 close(); 67 } 68 return flag; 69 } 70 71 private FTPClient getFtpClient() { 72 ftpClient = new FTPClient(); 73 ftpClient.setControlEncoding("utf-8"); 74 try { 75 logger.info("connecting...ftp server:" + this.hostname + ":" + this.port); 76 ftpClient.connect(hostname, Integer.valueOf(port)); //連接ftp服務器 77 ftpClient.login(username, password); //登錄ftp服務器 78 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 79 int replyCode = ftpClient.getReplyCode(); //是否成功登錄服務器 80 if (!FTPReply.isPositiveCompletion(replyCode)) { 81 logger.info("connect failed...ftp server:" + this.hostname + ":" + this.port); 82 } 83 logger.info("connect success...ftp server:" + this.hostname + ":" + this.port); 84 } catch (Exception e) { 85 logger.error("初始化FTP客戶端失敗原因:" + e.getMessage(), e); 86 } 87 return ftpClient; 88 } 89 90 private void close(){ 91 if (ftpClient.isConnected()) { 92 try { 93 ftpClient.disconnect(); 94 } catch (IOException e) { 95 } 96 } 97 if (null != os) { 98 try { 99 os.close(); 100 } catch (IOException e) { 101 } 102 } 103 } 104 }

FTP使用了兩個端口, 一個數據端口和一個命令端口(或稱為控制端口)。通常21端口是命令端口,20端口是數據端口。當混入主動/被動模式的概念時,數據端口就有可能不是20了

主動模式:PORT中文稱為主動模式,工作的原理: FTP客戶端連接到FTP服務器的21端口,發送用戶名和密碼登錄,登錄成功后要list列表或者讀取數據時,客戶端隨機開放一個端口(1024以上),發送 PORT命令到FTP服務器,告訴服務器客戶端采用主動模式並開放端口;FTP服務器收到PORT主動模式命令和端口號后,通過服務器的20端口和客戶端開放的端口連接,發送數據,原理如下圖:

 

被動模式:PASV是Passive的縮寫,中文成為被動模式,工作原理:FTP客戶端連接到FTP服務器的21端口,發送用戶名和密碼登錄,登錄成功后要list列表或者讀取數據時,發送PASV命令到FTP服務器, 服務器在本地隨機開放一個端口(1024以上),然后把開放的端口告訴客戶端, 客戶端再連接到服務器開放的端口進行數據傳輸,原理如下圖:

參考文章:http://my.oschina.net/binny/blog/17469


免責聲明!

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



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