20

org.apache.commons.net.ftp.FTPClient在我的一个应用程序中使用 FTP 服务器。我能够connect,login和. 但是,当我尝试访问文件时,它不会返回该目录中的文件列表,我确定那里有文件。我正在使用该方法,它返回一个空数组。pwdcwdlistFTPFile[] listFiles()FTPFile

请在我正在尝试的代码片段下面找到:

        String hostname = properties.getProperty("FTP_SERVER");
        String user = properties.getProperty("FTP_USER");
        String passwd = properties.getProperty("FTP_PASSWD");
        FTPClient client = new FTPClient();
        client.connect(hostname);
        client.login(user, passwd);
        String reply = client.getStatus();
        System.out.println(reply);
        client.enterRemotePassiveMode();
        client.changeWorkingDirectory("/uploads");
        FTPFile[] files = client.listFiles();
        System.out.println(files.length);
        for (FTPFile file : files) {
            System.out.println(file.getName());
        }

        String[] fileNames = client.listNames();
        if (fileNames != null) {
            for (String file : fileNames) {
                System.out.println(file);
            }
        }
        client.disconnect();
4

7 回答 7

20

这似乎与我遇到(并已解决)的问题相同,请参阅此答案:

Apache Commons Net FTPClient 和 listFiles()

于 2011-03-03T16:12:57.927 回答
6

在我设置模式后,PASV它现在工作正常!感谢您的所有努力和建议!

于 2010-02-26T07:49:20.297 回答
2

我添加client.enterLocalPassiveMode()并且它有效:

client.connect("xxx.com");
boolean login = client.login("xxx", "xxx");
client.enterLocalPassiveMode();
于 2017-06-30T05:52:38.327 回答
1

只是一个愚蠢的建议...您可以使用普通的 FTP 客户端在 /uploads 文件夹上列出列表。我问这个是因为某些 FTP 服务器设置为不显示上传文件夹的列表。

于 2010-02-26T06:32:25.470 回答
1

首先,确保该列表适用于其他程序。如果是这样,一种可能性是文件列表没有被正确解析。您可以尝试显式指定要与 initialListParsing 一起使用的解析器

于 2010-02-26T06:36:12.373 回答
1

我不得不遇到同样的问题,结果证明它无法解析服务器为文件列表返回的内容。我在连接到 ftp 服务器 ftpClient.setParserFactory(new MyFTPFileEntryParserFactory()); 之后这一行

public class MyFTPFileEntryParserFactory implements FTPFileEntryParserFactory {
private final static FTPFileEntryParser parser = new UnixFTPEntryParser() {
    @Override public FTPFile parseFTPEntry(String entry) {
        FTPFile ftpFile = new FTPFile();
        ftpFile.setTimestamp(getCalendar(entry));
        ftpFile.setSize(get(entry));
        ftpFile.setName(getName(entry));
        return ftpFile;
    }
};

@Override public FTPFileEntryParser createFileEntryParser(FTPClientConfig config) throws ParserInitializationException {
    return parser;
}

@Override public FTPFileEntryParser createFileEntryParser(String key) throws ParserInitializationException {
    return parser;
}

}

于 2014-10-06T19:15:42.093 回答
1

在我的例子中,除了应用enterLocalPassiveMode并指示正确的操作系统之外,我还需要将UnparseableEntries设置为 true 以使 listFile 方法工作。

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setUnparseableEntries(true);
f.configure(conf);
boolean isLoginSuccess = client.login(username, password);
于 2020-09-14T05:47:46.333 回答