FTPClient 中 FTPClient.changeWorkingDirectory(filePath) 代碼一直返回 false


FTP文件下載需要的jar包:

commons-net-2.0.jar  有時可能還需要:jakarta-oro.jar

參考:FTPClient參考文檔

這里記錄下我碰到的問題:

剛開始我的賬號和密碼直接都配的是我們公司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 }

 


免責聲明!

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



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