2013-08-03 45 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坠毁未抛出异常对我来说,所以为什么它被注释掉了,但我认为这是应该完成一个命令之后被调用。

相关问题