我在我的某个应用程序中使用org.apache.commons.net.ftp.FTPClient
来使用FTP服务器。我可以connect
,login
,pwd
和cwd
。但是,当我尝试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();
答案 0 :(得分:17)
这似乎与我遇到的问题相同(并已解决),请参阅此答案:
答案 1 :(得分:6)
将模式设置为PASV
后,它现在正常工作!
感谢您的所有努力和建议!
答案 2 :(得分:1)
只是一个愚蠢的建议......你可以使用普通的FTP客户端在/ uploads文件夹上进行列表吗?我问这个是因为有些FTP服务器被设置为不显示上传文件夹的列表。
答案 3 :(得分:1)
首先,确保列表在其他程序中有效。如果是这样,一种可能性是文件列表没有被正确解析。您可以尝试显式指定要与initiateListParsing一起使用的解析器。
答案 4 :(得分: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;
}
}
答案 5 :(得分:1)
我添加了client.enterLocalPassiveMode()
并且有效:
client.connect("xxx.com");
boolean login = client.login("xxx", "xxx");
client.enterLocalPassiveMode();
答案 6 :(得分:0)
在我的情况下,除了应用 enterLocalPassiveMode 并指示正确的操作系统外,我还需要将 UnparseableEntries 设置为true才能使listFile方法起作用。
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setUnparseableEntries(true);
f.configure(conf);
boolean isLoginSuccess = client.login(username, password);