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();
    }

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


person CodeGuy    schedule 08.05.2011    source источник
comment
Вы пробовали ответы на свой вопрос полчаса назад? stackoverflow.com/questions/5925438 /   -  person Aleadam    schedule 08.05.2011
comment
да, сейчас я использую FTPClient. Вопрос совсем в другом.   -  person CodeGuy    schedule 08.05.2011


Ответы (8)


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

person An̲̳̳drew    schedule 29.08.2011
comment
Для передачи в двоичном режиме: ftp.setFileType(FTP.BINARY_FILE_TYPE) - person DLight; 05.12.2016

Добавьте это в свой файл

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

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

person Stevan Buzejic    schedule 15.11.2011
comment
Я не думаю, что вы хотите вызывать setFileTransferMode таким образом - согласно JavaDoc он должен принимать только константы FTP.*_TRANSFER_MODE. - person Peter Becker; 04.03.2013
comment
-1, этот ответ неверен и приводит к пустой трате моего времени. Только ftp.setFileType(FTP.BINARY_FILE_TYPE); требуется, если вы поместите второй параметр ftp.setFileType (FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE), файл будет поврежден (с pdf и xls) - person amdev; 13.06.2016
comment
Что-то изменилось в FTPClient? Потому что для меня это FTPClient.BINARY_FILE_TYPE. - person sigi; 15.10.2017

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

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

person Chris Stratton    schedule 08.05.2011
comment
Ваш комментарий только что решил двухлетнюю проблему, с которой я столкнулся. Здоровья вам. - person mk.hd; 01.04.2015

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

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
res = client.storeFile("File Name", bis);
bis.close();
client.logout();
person MByD    schedule 08.05.2011
comment
Два коротких вопроса - пробовали ли вы открыть файл на клиентской машине? Вы пробовали отправить другой файл? - person MByD; 08.05.2011
comment
да, с другими файлами все в порядке. и что значит открыть его на клиентской машине? в основном, после того, как я загружаю его, я загружаю его на свою локальную машину. это ftp на сайте, которым я владею. - person CodeGuy; 08.05.2011
comment
Вам удалось открыть файл перед загрузкой? может у вас проблема в механизме загрузки? -- Я не уверен в этом, просто пытаюсь помочь :S - person MByD; 08.05.2011
comment
Ага. исходный файл в порядке. тьфу, я не уверен, почему это не работает. Он отлично работает с другими файлами, которые я пробовал, например с текстовыми файлами. что-то особенное в pdf. - person CodeGuy; 08.05.2011

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

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

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

person Bala R    schedule 08.05.2011
comment
@reising1 Тогда я не уверен. Вы пробовали предложение @MByd? - person Bala R; 08.05.2011

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

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

objFtpClient.enterLocalPassiveMode();
person JK Patel    schedule 14.10.2013

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

person Swarit Agarwal    schedule 12.10.2014

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

person Paŭlo Ebermann    schedule 17.07.2011