Acceder a un servidor FTP con Java y Apache Commons Net

Estándar

Una de las formas mas sencillas de almacenar archivos en un servidor remoto es por medio del ya clásico protocolo de Transferencia de Archivos, mejor conocido como FTP y su versión actualizada el sFTP, por esto no es de extrañar la existencia de librerías que le permitan al lenguaje Java el uso de estos protocolos como lo son las librerias Apache Commons Net, cuyo uso basico se describira en esta entrada.

Obteniendo las librerias Apache Common Net

Las librerias para el acceso a FTP (asi como otro conjunto de protocolos de red) puede obtenerse en la pagina oficial de la libreria Apache Commons, en la sección de descargas específicamente http://commons.apache.org/proper/commons-net/download_net.cgi para el ejemplo de esta entrada utilizaremos la versión 3.3, descargue los binarios ya sea en .zip o en tar.gz al abrir el archivo y entrar a la carpeta commons-net-3.3 observara algo similar a la figura 1

Figura 01 - contenido del archivo

Figura 01 – contenido del archivo

De los archivos presentes extraiga el archivo commons-net-3.3.jar este es el que contiene las librerías en si.

Creando proyecto

Cree un nuevo proyecto en Eclipse (en este caso lo llamare FtpList) y agregue la librería commons-net-3.3.jar a este mismo, el procedimiento para agregar una librería a un proyecto en Eclipse esta descrito con detalle en la siguiente entrada de este blog: https://hashblogeando.wordpress.com/2013/07/14/itext-generacion-de-archivo-pdf-en-java/ .Una vez que la librería este agregada el entorno lucirá como la figura 2

Figura 02 - Proyecto ejemplo

Figura 02 – Proyecto ejemplo

Hecho esto podemos comenzar con el código.

Programa

Como un ejemplo sencillo de lo que se puede hacer con la librería apache commons accederemos a un servidor ftp y listaremos los archivos del directorio raíz.

package mx.hashSoft.ftpList;

import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class Listar {

   static public void main(String[] args) {

      // Datos para la conexion
      String server = <dirección del servidor>;
      String username = <Usuario del servidor>;
      String password = <Contraseña del usuario>;

      // Cliente de conexion a FTP
      FTPClient ftp = new FTPClient();

      int respuesta, i;
      String[] lista;

      try{
            System.out.println(“CONECTANDO AL SERVIDOR FTP”);
            // Conectando e identificandose con el servidos
            ftp.connect(server);
            ftp.login(username, password);
            // Entrando a modo pasivo
            ftp.enterLocalPassiveMode();

            // Obteniendo respuesta del servidos
            respuesta = ftp.getReplyCode();
            System.out.println(“RESPUESTA ” + respuesta);

            // Si la respuesta del servidor indica podemos pasar procedemos
            if(FTPReply.isPositiveCompletion(respuesta) == true ) {
                  System.out.println(“LISTANDO ARCHIVOS”);
                  lista = ftp.listNames();

                  for(i=0; i<lista.length; i++) {

                        System.out.println(lista[i]);
                  }
            // Si no avisamos
            } else {
                        System.out.println(“ERROR DE CONEXION”);
            }

            // en ambos casos terminaos sesion
            ftp.logout();
            // Y nos desconectamos
            ftp.disconnect();

            // Esta excepcion se lanza en caso de algun error durante el proceso
            }catch(IOException e) {
                  System.out.println(“Error de conexion”);
            }
      }
}

Como ya es costumbre las lineas en rojo son las mas importantes para realizar la conexión y listar los archivos, estas se describirán a continuación:

import java.io.IOException; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; : Estas son las clases que necesitaremos para este ejemplo que son la excepción de entrada/salida, el cliente FTP y las respuestas del cliente FTP todas se usara en este ejemplo.

String server = <dirección del servidor>; String username = <Usuario del servidor>; String password = <Contraseña del usuario>; : Aqui colocamos las información para conectarnos al servidor, necesitara la dirección del servidor FTP, el usuario de dicho servidor y la contraseña de dicho usuario.

FTPClient ftp = new FTPClient(); : Creamos un objecto para acceder a un servidor FTP

ftp.connect(server); : Nos conectamos al servidor, es importante notar que conectarse al servidor no es lo mismo que iniciar sesión.

ftp.login(username, password); : Iniciamos sesión en el servidor, para esto debe de indicarse el nombre de usuario y la contraseña de dicho usuario.

ftp.enterLocalPassiveMode(); : Entrar al modo pasivo, esto es recomendable para conexiones con en la forma cliente-servidor.

respuesta = ftp.getReplyCode(); : Con esto obtenemos la respuesta que dio el servidor a la ultima instrucción que enviamos.

FTPReply.isPositiveCompletion(respuesta) : Con esto comprobamos que la respuesta a nuestro ultimo pedido halla sido positiva, lo que significa que se realizo correctamente.

lista = ftp.listNames(); : Con esta instrucción solicitamos la lista de nombres de archivo y directorios en el directorio actual.

ftp.logout(); : Terminamos la sesión actual en el servidor.

ftp.disconnect(); : Nos desconectamos del servidor.

catch(IOException e) : Esta clausula catch es para manejar la excepción que se genera si algo ocurre durante la conexión.

Para correr el programa necesitara indicar los datos correctos para el servidor, usuario y contraseña, hecho esto ejecute el programa, el resultado lucirá como la figura 3

Figura 03 - Salida del programa

Figura 03 – Salida del programa

Espero que esta entrada fuera de ayuda y nos vemos en la próxima.

Anuncios

FTP file transfer in Java using Apache Commons Net

Estándar

Codigo para subir un archivo FTP usando Java y las librerias Apache

Glass Onion Blog

The following sample code works well with Java 1.5 and Apache Commons Net 1.4.1

import org.apache.commons.net.ftp.*;
...
boolean ftpTransfer(String localfile, String destinationfile)
{
	String server = "ftp.domain.com";
	String username = "ftpuser";
	String password = "ftppass";
	try
	{
		FTPClient ftp = new FTPClient();
		ftp.connect(server);
		if(!ftp.login(username, password))
		{
			ftp.logout();
			return false;
		}
		int reply = ftp.getReplyCode();
		if (!FTPReply.isPositiveCompletion(reply))
		{
			ftp.disconnect();
			return false;
		}
		InputStream in = new FileInputStream(localfile);
		ftp.setFileType(ftp.BINARY_FILE_TYPE);
		boolean Store = ftp.storeFile(destinationfile, in);
		in.close();
		ftp.logout();
		ftp.disconnect();
	}
	catch (Exception ex)
	{
		ex.printStackTrace();
		return false;
	}
	return true;
}
 

Ver la entrada original