Подтвердить что ты не робот

Apache Commons FTPClient.listFiles

Я использую 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();
4b9b3361

Ответ 2

После установки режима PASV он работает нормально! Спасибо за все ваши усилия и предложения!

Ответ 3

Просто глупое предложение... можете ли вы сделать листинг в папке /uploads с помощью обычного FTP-клиента. Я спрашиваю об этом, потому что некоторые FTP-серверы настроены так, чтобы не отображать список загружаемой папки.

Ответ 4

Во-первых, убедитесь, что листинг работает в других программах. Если это так, одна из возможностей заключается в том, что список файлов не обрабатывается правильно. Вы можете попробовать явно указать парсер для использования с initiateListParsing.

Ответ 5

У меня была такая же проблема, и оказалось, что он не смог разобрать, что сервер возвращал для списка файлов. Я эту строку после подключения к 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;
}

}

Ответ 6

Я добавил client.enterLocalPassiveMode(), и он работает:

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