我所使用的是org.apache.commons.net.ftp.FTPClient。 查了資料還有其他幾個FTPClient,其他的先不展開。html
1.ftpClient.changeWorkingDirectory一直返回false.java
個人解決方法是所傳入的參數不能是ftp://ip地址/data/vcode/ 這種形式的,而應該是/home/commonservice/data/vcode/這種形式的。網上查了不少方法也試了不少,都不對本次開發有效,有時候,是本身參數傳的不對致使。apache
2.從ftp服務器下載含圖片的zip包,下載下來後解壓失敗,說是文件已損壞。api
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);加上這一句,以二進制的形式服務器
3.ftpClient.retrieveFileStream 讀取服務器中的命名文件spa
有以上這一行代碼的話必須加.net
is.close();code
ftpClient.completePendingCommand();htm
這兩行,不然接下來的 ftpClient的操做就會失敗blog
4.從ftp服務器下載的zip包到本地解壓,解壓失敗
有時不是你代碼有問題,而是ftp服務器上的這個zip包原本就解壓不出來。我就遇到這個問題了,查了半天代碼都沒查出來。
5.主動模式和被動模式的概述
PORT(主動模式)
PORT中文稱爲主動模式,工做的原理: FTP客戶端鏈接到FTP服務器的21端口,發送用戶名和密碼登陸,登陸成功後要list列表或者讀取數據時,客戶端隨機開放一個端口(1024以上),發送 PORT命令到FTP服務器,告訴服務器客戶端採用主動模式並開放端口;FTP服務器收到PORT主動模式命令和端口號後,經過服務器的20端口和客戶端開放的端口鏈接,發送數據。
PASV(被動模式)
PASV是Passive的縮寫,中文成爲被動模式,工做原理:FTP客戶端鏈接到FTP服務器的21端口,發送用戶名和密碼登陸,登陸成功後要list列表或者讀取數據時,發送PASV命令到FTP服務器, 服務器在本地隨機開放一個端口(1024以上),而後把開放的端口告訴客戶端, 客戶端再鏈接到服務器開放的端口進行數據傳輸。
---------------------
兩種模式的比較
從上面的運行原來看到,主動模式和被動模式的不一樣簡單概述爲: 主動模式傳送數據時是「服務器」鏈接到「客戶端」的端口;被動模式傳送數據是「客戶端」鏈接到「服務器」的端口。
主動模式須要客戶端必須開放端口給服務器,不少客戶端都是在防火牆內,開放端口給FTP服務器訪問比較困難。
被動模式只須要服務器端開放端口給客戶端鏈接就好了。
參考文獻 http://www.cnblogs.com/mawanglin2008/articles/3607767.html
6.附上FTPClient的文檔
http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#changeWorkingDirectory(java.lang.String)