passive net ftpclient example descargar commons archivo java ftp ftp-client apache-commons-net

java - net - spring boot ftp



FTPClient-Java, cargar archivo (8)

Esto parece un error en la biblioteca Commons NET , que afectó a la versión 3.0. Pruebe con una versión más nueva (3.0.1), que corrigió el error.

Estoy tratando de hacer una carga de archivo MUY simple. Quiero un Java FTPClient que pueda cargar cualquier archivo que le indique. Pero el pdf siempre se descompone y mi editor de PDF (Adobe) no lo abre, diciendo que hay un error de E / S.

Estoy usando la siguiente clase:

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

¿Por qué esto no funciona y cómo lo soluciono?


A menudo se olvida que FTP tiene dos modos de operación: uno para archivos de texto y otro para archivos binarios (imágenes). En los viejos tiempos, al conectarnos desde un cliente FTP de línea de comando, recordamos cuidadosamente configurar el modo de transferencia antes de solicitar un archivo, o nos topamos con el tipo de problema que parece tener. Hoy en día, muchas situaciones parecen predeterminadas como binarias, pero aparentemente no son tuyas.

Probablemente necesites decirle a tu implementación ftp que transfiera en modo binario / imagen.


De la documentación

Este método NO cierra el InputStream dado.

Así que cierre FileInputStream antes de llamar a logout()


Intenta usar BufferedInputStream , esta es una muestra de código (de trabajo):

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


Agregue esto a su archivo

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

Tuve el mismo problema con los archivos xlsx y esta fue una buena solución.


Prueba esto.

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE); objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE); objFtpClient.enterLocalPassiveMode();


Para mí solo funcionaba ftp.setFileType (FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE), mientras que cuando estaba usando ftp.setFileTransferMode (FTP.BINARY_FILE_TYPE) el archivo se estaba volviendo corrupto.


No funciona porque el modo de transferencia predeterminado para FTPClient es FTP.ASCII_FILE_TYPE . Solo necesita actualizar la configuración para transferirla en modo binario.