Ответ 1
Это похоже на ту же проблему, что и у меня (и решена), см. этот ответ:
Я использую 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();
Это похоже на ту же проблему, что и у меня (и решена), см. этот ответ:
После установки режима PASV
он работает нормально!
Спасибо за все ваши усилия и предложения!
Просто глупое предложение... можете ли вы сделать листинг в папке /uploads с помощью обычного FTP-клиента. Я спрашиваю об этом, потому что некоторые FTP-серверы настроены так, чтобы не отображать список загружаемой папки.
Во-первых, убедитесь, что листинг работает в других программах. Если это так, одна из возможностей заключается в том, что список файлов не обрабатывается правильно. Вы можете попробовать явно указать парсер для использования с initiateListParsing.
У меня была такая же проблема, и оказалось, что он не смог разобрать, что сервер возвращал для списка файлов. Я эту строку после подключения к ftp-серверу ftpClient.setParserFactory(новый 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();