FTPClient - Java, загрузить файл - PullRequest
24 голосов
/ 08 мая 2011

Я пытаюсь сделать ОЧЕНЬ простую загрузку файла. Я хочу 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 ]

25 голосов
/ 29 августа 2011

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

24 голосов
/ 15 ноября 2011

Добавить это в ваш файл

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

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

9 голосов
/ 08 мая 2011

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

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

3 голосов
/ 08 мая 2011

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

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
res = client.storeFile("File Name", bis);
bis.close();
client.logout();
2 голосов
/ 08 мая 2011

Из документации

Этот метод НЕ закрывает данный InputStream.

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

1 голос
/ 12 октября 2014

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

1 голос
/ 14 октября 2013

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

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

objFtpClient.enterLocalPassiveMode();
0 голосов
/ 17 июля 2011

Это похоже на ошибку в библиотеке Commons NET , которая затронула версию 3.0. Попробуйте более новую версию (3.0.1), в которой исправлена ​​ошибка.

...