2013-08-03 47 views
0

我正在使用Apache Commons FTPClient從FTP服務器獲取文件。這是設置:Apache Commons FTPClient無法檢索某些文件

ftpClient.setDefaultPort(port); 
      ftpClient.connect(server); 
      ftpClient.login(user, password); 
      ftpClient.enterLocalPassiveMode(); 
      ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 
      ftpClient.changeWorkingDirectory(path); 

這是傳遞代碼:

final FileOutputStream fileOutputStream = new FileOutputStream(tempFile); 
        final boolean result = ftpClient.retrieveFile(dirToList + aFile.getName(), fileOutputStream); 
        Log.i(TAG, "[" + (result ? "+" : "-") + "]"); 

而且我看到在日誌中的內容:

I/SyncService(4412): /Users/user1/Downloads/FtpSync/.idea/copyrightprofiles_settings.xml 
I/SyncService(4412): [-] 
<...> 
I/SyncService(4412): /Users/user1/Downloads/FtpSync/footer.php 
I/SyncService(4412): [+] 

所有的PHP文件同步,和所有的XML文件無法同步。 FTP服務器位於本地筆記本電腦上(Mac OS X默認ftp服務器,tnftpd 20100324 + GSSAPI)

爲什麼它不起作用?

回答

1

首先,您應該總是在retrieveFile方法後關閉輸出流。下載XML文件時是否嘗試過更改FTP {文件類型}(儘管不是這種情況)?

+0

更改爲ASCII,這沒有幫助。 – arts777

+0

你的代碼似乎沒有錯。我的下一個想法是用戶權限。您確定您的ftp用戶帳戶具有訪問xml所需的權限嗎?你有沒有嘗試檢查你的下載請求的服務器響應? – awb

+0

我正在與rankor777帳戶連接,/ Users/rankor777是此用戶的主頁。我會嘗試用ftp命令手動檢查它。 – arts777

0

使用此代碼下載文件。

public boolean ftpDownload(String srcFilePath, String desFilePath) 
    { 
     boolean status = false; 
     try { 
      FileOutputStream desFileStream = new FileOutputStream(desFilePath);; //desfilepath where the file is to be stored 
      status = mFTPClient.retrieveFile(srcFilePath, desFileStream); 

      desFileStream.close(); 

      return status; 
     } catch (Exception e) { 
      Log.d(TAG, "download failed"); 
     } 

     return status; 
    } 
+0

這與我的問題有什麼關係? – arts777

+0

確定使用新代碼來檢索文件。 – Prakhar

+0

此代碼與我使用的代碼相同。 – arts777

1

我在使用retrieveFile方法下載一些大文件時遇到問題,它會在不引發異常的情況下崩潰。最後我使用了retrieveFileStream方法,它爲我解決了它。

更換

status = mFTPClient.retrieveFile(srcFilePath, desFileStream); 

隨着

// import org.apache.commons.io.IOUtils; 

InputStream inputStream = mFTPClient.retrieveFileStream(srcFilePath); 
IOUtils.copy(inputStream, desFileStream); 
outputStream.flush(); 
IOUtils.closeQuietly(desFileStream); 
IOUtils.closeQuietly(inputStream); 

//status = mFTPClient.completePendingCommand(); 
status = true; 

completePendingCommand墜毀未拋出異常對我來說,所以爲什麼它被註釋掉了,但我認爲這是應該完成一個命令之後被調用。

相關問題