0

我正在使用 Apache Commons FTPClient 从 FTP 服务器获取文件。这是设置:

 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)

为什么它不起作用?

4

3 回答 3

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 在没有为我抛出异常的情况下崩溃了,因此它被注释掉了,但我认为它应该在完成命令后调用。

于 2013-09-04T04:37:31.637 回答
1

首先,您应该始终在retrieveFile 方法之后关闭输出流。您是否尝试在下载 XML 文件时更改 FTP.{filetype} (尽管这不应该是这种情况)?

于 2013-08-03T13:00:21.183 回答
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;
    } 
于 2013-08-03T13:00:52.153 回答