FTPClient-Java, загрузить файл

Я пытаюсь сделать очень простую загрузку файла. Мне нужен Java FTPClient, который может загружать любой файл, который я ему говорю. Но pdf всегда все перепутано, и мой редактор pdf (Adobe) не откроет его, сказав, что есть ошибка ввода-вывода.

Я использую следующий класс:

    import org.apache.commons.net.ftp.FTPClient;
    ....

    FTPClient client = new FTPClient();
    FileInputStream fis = null;

    try {
        client.connect("mydomain.com");
        client.login("user", "password");

        String filename = "myPDF.pdf";
        fis = new FileInputStream(filename);

        client.storeFile("temp.pdf", fis);
        fis.close();
        client.logout();
    } catch (IOException e) {
        e.printStackTrace();
    }

почему это не работает, и как это исправить?

8 ответов


Он не работает, потому что режим передачи по умолчанию для FTPClient is FTP.ASCII_FILE_TYPE. Вам просто нужно обновить конфигурацию для передачи в двоичном режиме.


добавьте это в ваш файл

ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);

У меня была та же проблема с файлами xlsx, и это было хорошее решение.


часто забывают, что FTP имеет два режима работы - один для текстовых файлов, а другой для двоичных файлов (изображений). В старые добрые времена, подключаясь из ftp-клиента командной строки, мы бы тщательно запомнили, чтобы установить режим передачи, прежде чем запрашивать файл - или мы столкнулись бы именно с такой проблемой, которую вы, кажется, имеете. Сегодня многие ситуации кажутся по умолчанию двоичными, но, по-видимому, не вашими.

вам, вероятно, нужно сообщить вашей реализации ftp для передачи в двоичном режиме/изображение.


попробуйте использовать BufferedInputStream, это (рабочий) пример кода:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
res = client.storeFile("File Name", bis);
bis.close();
client.logout();

С документация

этот метод не закрывает данный Класса InputStream.

поэтому закройте FileInputStream перед вызовом logout()


попробуйте это.

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

objFtpClient.enterLocalPassiveMode();

для меня только ftp.setFileType (FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE) работал, когда я использовал ftp.setFileTransferMode (FTP.BINARY_FILE_TYPE) файл был поврежден.


Это выглядит как ошибка в библиотеке Commons NET, что повлияло на версию 3.0. Попробуйте более новую версию (3.0.1), которая исправила ошибку.