Apache Commons FTPClient.listFiles

我在我的一个应用程序中使用org.apache.commons.net.ftp.FTPClient来使用FTP服务器。 我能够connectloginpwdpwd 。 但是,当我尝试list文件时,它不会返回该目录中的文件列表,我知道确实存在文件。 我使用FTPFile[] 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(); 

这看起来像我遇到的问题(并解决了),看到这个答案:

Apache Commons Net FTPClient和listFiles()

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

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

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

我不得不遇到同样的问题,事实certificate它无法解析服务器为文件列表返回的内容。 我在连接到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; } 

}

我添加了client.enterLocalPassiveMode() ,它可以工作:

 client.connect("xxx.com"); boolean login = client.login("xxx", "xxx"); client.enterLocalPassiveMode();