FTP文件下載需要的jar包:
commons-net-2.0.jar 有時可能還需要:jakarta-oro.jar
這里記錄下我碰到的問題:
剛開始我的賬號和密碼直接都配的是我們公司SSH連接服務器的用戶名和密碼,只是把端口改成了21,原端口是7979,程序竟然能連接上登錄成功。
一共有兩個IP,A(124.237.121.6) 和 B(124.237.121.126),連接A的時候一切正常,連接B的時候在切換工作目錄的時候一直切不過去,changeWorkingDirectory返回的一直是false。
於是開始查詢資料,網上總結了下大約有這幾種情況:
1、傳入的路徑含有中文,需要進行轉碼操作,我的路徑沒有中文,排除。下面的代碼中我添加了這種情況的解決辦法。
2、登錄后默認目錄不是根目錄,如果切換的路徑寫的是相對路徑,在切換目錄的時候就會找不到(不以“/”開頭的路徑是相對路徑;以“/”開頭的路徑是絕對路徑),我都用的是絕對路徑,所以這種情況排除。
3、賬號權限問題,我碰到的問題應該歸到這種情況中。
我們服務器上的完整目錄大概是這樣的:/site/wdxcorder/xxx/xxxx/xxx/......
A和B上的文件都在/site/wdxcorder/autoCompose/下
到這里我已經發現用錯賬號了,從數據庫中找到FTP服務器正確的賬號和密碼,端口還是21。
這個賬號能登陸A和B,雖然根目錄也都相同,登陸后都是直接訪問的/site/文件夾下的內容,區別在於A上面該賬號有權限回退訪問/site/的上一級目錄,但是B上面該賬號卻沒有權限回退訪問到/site/的上一級目錄
所以,A上面文件/site/wdxcorder/autoCompose/aaa.jpg可以正常訪問到,而B上/site/wdxcorder/autoCompose/bbb.jpg 卻不能訪問到。
賬號權限不能改動,所以只能改目錄了,程序里添加了判斷,訪問B上文件的時候把路徑中的/site干掉,ok,問題解決!
FTP下載文件工具類:
1 package com.wdxc.util; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.OutputStream; 7 8 import org.apache.commons.net.ftp.FTPClient; 9 import org.apache.commons.net.ftp.FTPClientConfig; 10 import org.apache.commons.net.ftp.FTPFile; 11 import org.apache.commons.net.ftp.FTPReply; 12 import org.apache.log4j.Logger; 13 14 15 /** 16 * FTP文件下載 17 * @author wangbo 18 * 19 */ 20 public class FTPUtil { 21 22 private static Logger logger = Logger.getLogger(FTPUtil.class); 23 private static int port = 21; 24 private static String username = "xxxxxx"; 25 private static String password = "xxxxxxxxxxxxxxxxxx"; 26 27 public static boolean fileDown(String ip,String fileDir,String saveFTPDir){ 28 29 FTPClient ftp = null; 30 File file = new File(saveFTPDir); 31 if(!file.exists() && !file.isDirectory()){//如果文件夾不存在則創建 32 logger.debug("文件目錄不存在,創建。"); 33 file.mkdirs(); 34 } 35 try{ 36 //ftp的數據下載 37 ftp = new FTPClient(); 38 ftp.connect(ip, port); 39 ftp.login(username, password); 40 ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//傳輸圖片的話設置文件類型為二進制 41 //ftp.setControlEncoding("UTF-8");//如果有中文文件名的話需要設置 42 43 //設置linux環境 44 FTPClientConfig conf = new FTPClientConfig( FTPClientConfig.SYST_UNIX); 45 ftp.configure(conf); 46 47 //判斷是否連接成功 48 int reply = ftp.getReplyCode(); 49 if (!FTPReply.isPositiveCompletion(reply)){ 50 ftp.disconnect(); 51 logger.debug("FTP服務無法連接!"); 52 return false; 53 } 54 55 //設置訪問被動模式 56 ftp.setRemoteVerificationEnabled(false); 57 ftp.enterLocalPassiveMode(); 58 59 //切換工作目錄到文件所在的目錄 60 //boolean dir = ftp.changeWorkingDirectory(new String(fileDir.getBytes(),FTP.DEFAULT_CONTROL_ENCODING));//如果是中文路徑需要處理 61 boolean dir = ftp.changeWorkingDirectory(fileDir); 62 if (dir) { 63 //檢索ftp目錄下所有的文件 64 FTPFile[] fs = ftp.listFiles(); 65 for(FTPFile f : fs){ 66 File localFile = new File(saveFTPDir+f.getName()); 67 OutputStream ios = new FileOutputStream(localFile); 68 ftp.retrieveFile(f.getName(), ios); 69 ios.close(); 70 } 71 return true; 72 }else { 73 logger.debug("服務器編碼方式可能有問題,請檢查!"); 74 return false; 75 } 76 }catch (Exception e){ 77 e.printStackTrace(); 78 logger.debug("ftp下載文件發生異常!"); 79 return false; 80 }finally{ 81 if(ftp != null) try {ftp.disconnect();} catch (IOException ioe) {} 82 } 83 } 84 85 }