- 獲取ftp目錄下文件列表為空的情況。
1 FTPFile[] fs = ftp.listFiles(remotePath);
這里代碼獲取fs的長度為0.很苦惱。
奇怪的是我在我本機的windows系統下搭建的ftp服務器正常。但在linux下面卻不行。
只需要在加入下一行代碼即可。
//這個方法的意思就是每次數據連接之前,ftp client告訴ftp server開通一個端口來傳輸數據 ftp.enterLocalPassiveMode();
2.下載文件報Host attempting data connection ip address is not same as server
這個錯誤只有當我獲取文件的地址為內網ip才會出現這種情況,需要修改一個設置。setRemoteVerificationEnabled
服務器會獲取自身Ip地址和提交的host進行匹配,當不一致時報出以上異常。
將此參數設置為false即可。默認為true。
ftp.setRemoteVerificationEnabled(false);
ftp下載文件的代碼如下:
/** * /** Description: 從FTP服務器下載文件 * * @param url FTP服務器hostname * @param port FTP服務器端口 * @param username FTP登錄賬號 * @param password FTP登錄密碼 * @param remotePath FTP服務器上的相對路徑 * @param fileName 要下載的文件名 * @param localPath 下載后保存到本地的路徑 * @return */ public boolean downFile(String remotePath, String fileName, String localPath) { boolean success = false; try { if(!ftp.isConnected()){ logger.debug("獲取文件失敗"); return false; } //這個方法的意思就是每次數據連接之前,ftp client告訴ftp server開通一個端口來傳輸數據。 //為什么要這樣做呢,因為ftp server可能每次開啟不同的端口來傳輸數據,但是在linux上或者其他服務器上面, //由於安全限制,可能某些端口沒有開啟,所以就出現阻塞。 ftp.enterLocalPassiveMode(); ftp.setRemoteVerificationEnabled(false); ftp.changeWorkingDirectory(remotePath);// 轉移到FTP服務器目錄 FTPFile[] fs = ftp.listFiles(remotePath); boolean fileExsit = false; for (FTPFile ff : fs) { if (ff.getName().equals(fileName)) { fileExsit = true; File localFile = new File(localPath + "/" + ff.getName()); OutputStream is = new FileOutputStream(localFile); ftp.retrieveFile(ff.getName(), is); is.close(); break; } } if(!fileExsit){ System.out.println("文件不存在"); return success; } success = true; } catch (IOException e) { e.printStackTrace(); throw new ServiceException("下載文件失敗"); } return success; }