Apache Commons FTPClient.listFiles
我在我的一个应用程序中使用org.apache.commons.net.ftp.FTPClient
来使用FTP服务器。 我能够connect
, login
, pwd
和pwd
。 但是,当我尝试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();