Subir fichero desde Java a servidor FTP / FTPS / SFTP

[notice]Desde que este post fue creado han pasado 5 años así que puede que hayan cambiado cosas.[/notice]

FTP / FTPS

Primero hemos de importar la librería commons-net-X.Y.jar que descargaremos desde la web de apache a nuestro proyecto. Si usamos eclipse, botón derecho en el proyecto -> Build Path -> Configure Build Path

En el fichero Java, añadimos los imports necesarios para poder enviar por FTP.

import org.apache.commons.net.ftp.FTP; // Nos permite indicar si transfer BINARY o ASCII
import org.apache.commons.net.ftp.FTPClient; // Para FTP plano
import org.apache.commons.net.ftp.FTPSClient; // Para FTPSecure (FTPS)
import java.io.FileInputStream; // Abrir y leer el fichero

Creamos el código para subir el fichero

String remote_working_dir_path = "/ruta/remota/del/ftp/";
String local_filepath = "C:/Users/driverlandia/Desktop/commons-net-3.6.jar";
String remote_filename = "commons-net-3.6.jar";

FileInputStream fis = new FileInputStream(local_filepath);
FTPClient client = new FTPClient();
try {
    client.setBufferSize(512); // Opcional para definir Buffer size en bytes
    client.connect("servidor.ftp.com",21); // no el puerto es por defecto, podemos usar client.connect("servidor.ftp.com");
    client.login( props.getProperty("pgi20_ftp_user"), props.getProperty("pgi20_ftp_pass") );
    client.enterLocalPassiveMode(); // IMPORTANTE!!!! 
    client.setFileType(FTP.BINARY_FILE_TYPE);
    client.changeWorkingDirectory(remote_working_dir_path);
    boolean uploadFile = client.storeFile(remote_filename,fis);
    client.logout();
    client.disconnect();

    if ( uploadFile == false ) {
        throw new Exception("Error al subir el fichero");
    }
} catch (Exception eFTPClient) {
    // Gestionar el error, mostrar pantalla, reescalar excepcion... etc...
} finally {
    fis.close();
}

En caso de ser un servidor FTPS el codigo es exactamente igual, tan solo tendremos que cambiar la linea

FTPClient client = new FTPClient();

por la siguiente

FTPSClient client = new FTPSClient();

La linea marcada como importante en el codigo, tiene su sentido a la pregunta: FTPClient crea fichero con 0 bytes o FTPClient no sube correctamente el fichero independientemente si es un FTP o FTPS. En mi caso este era el problema. Se me creaba el fichero en el FTP, pero no subia el contenido. Además tardaba demasiado a la hora de ejecutar ftp.storeFile.

Fue añadir esta configuración y subía el fichero correctamente y además no tardaba nada.

SFTP

Para subir un fichero a un servidor SFTP, haremos uso de la librería JSCH (jsch-x.y.z.jar) que también deberemos importar en nuestro proyecto.

Descargaremos la class STFPUtils (para no reinventar la rueda) de https://dnhome.wordpress.com/2012/06/25/java-upload-file-to-sftp-server/ y la acomodaremos a nuestro gusto. En mi caso he cambiado el logger por el propio del framework que estoy utilizando.

En nuestro Java haremos uso del siguiente código para subir el fichero.

SFTPUtils sftp = new SFTPUtils();
sftp.setHostName("sftp.servidor.com");
sftp.setHostPort("22");
sftp.setUserName("usuario");
sftp.setPassWord("password");
sftp.setDestinationDir( remote_working_dir_path );
sftp.uploadFile(local_filepath , remote_filename );

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.