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), которая исправила ошибку.