Задать вопрос
@KChernenko
Android/Java/Security

Как реализовать загрузку файла с ftp сервера на java?

Нужно реализовать загрузку файла с ftp сервера. Для этого подключил библиотеку Apache commons-net и использую вот такой вот метод:
public boolean downloadFromFTP(String fileName) throws IOException {
        FTPClient ftpClient = new FTPClient();

        ftpClient.connect(address, port);
        ftpClient.login(username, password);

        ftpClient.enterRemotePassiveMode();
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

        FileOutputStream fileOutputStream = new FileOutputStream("files/" + fileName);
        boolean isDownloaded = ftpClient.retrieveFile("/Test/" + fileName, fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
        ftpClient.logout();
        ftpClient.disconnect();

        return isDownloaded;
    }

Проблема в том, что все загруженные файлы по 0 Kb. Нагуглил, что это баг в библиотеке, и его якобы исправили в версии 3.0.1, но я использую 3.2 (даже пробовал 3.3). Как обойти данный баг? Может, кто-то сталкивался с подобным.
  • Вопрос задан
  • 6938 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
@bobzer
Java EE Developer
Скорее всего, операция загрузки завершилась ошибкой, а вы это не проверили. При возникновении ошибок, FTPClient не выбрасывает исключение, а просто сохраняет код ошибки, а вызванный метод возвращает false. При этом исполнение кода продолжается и доходит до корректного закрытия файла, из-за чего вы получаете файл размером 0 байт. Если retrieveFile вернул false, то смотрите ftpClient.getReplyString(), вместо того, чтобы корректно закрывать файл. Например, можно сделать так:
if(!isDownloaded) {
    throw new Exception(ftpClient.getReplyString());
}

При этом конечно не забывать об освобождении ресурсов в блоке finally пока что не существующего в методе блока try...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы