martes, 13 de enero de 2009

Acceder a un Ftp con jakarta commons-net

El proyecto jakarta commons-net nos proporciona implementaciones protocolos de Internet en java para poder utilizarlos en el lado del cliente. Los protocolos que soporta son los siguientes:
  • FTP/FTPS
  • NNTP
  • SMTP
  • POP3
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP

En este ejemplo veremos como acceder a un ftp con esta libreria

Para usarlo tenemos que descargar los siguientes jar de la pagina oficial:

- commons-net-1.4.1.jar
- jakarta-oro-2.0.8.jar


El primer jar nos proporciona las clases que implementan los protocolos antes mencionados y en el segundo jar contiene algunas clases para evaluar expresiones. El primero usa clases del segundo por lo cual necesitamos agregar ambos a nuestro classpath.

Aquí tenemos el ejemplo :

import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;

public class Main {
public static void main(String[] args) {
FTPClient f = new FTPClient();
try {
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); //Este objeto nos
f.configure(conf); //permite configurar opciones de conexion como idioma y sistema de archivos
f.connect("127.0.0.1"); // ip del servidor ftp
f.login("usuario", "usuario"); // usuario y password para conectarnos al ftp
f.changeWorkingDirectory("diruno"); // Cambiamos de la raiz al subdirectorio uno
System.out.println(" Crea directorio ? "+f.mkd("dirprueba")); //crea un directorio en diruno
FTPFile[] files = f.listFiles(); // Obtiene los archivos del servidor y los mostramos
System.out.println(f.isConnected());
for (FTPFile arch : files){
System.out.println(arch.toString());
}
f.disconnect();
System.out.println(f.isConnected());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

Les dejo el link de la pagina oficial http://commons.apache.org/net/


Upate: Les dejo un ejemplo mas, es como el anterior pero almacena un arcivo de la maquina local en el ftp



public class Main {

 public static void main(String[] args) {
  FTPClient f = new FTPClient();
  try {
  FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); //Este objeto nos
  f.configure(conf); //permite configurar opciones de conexion como idioma y sistema de archivos
  f.connect("127.0.0.1"); // ip del servidor ftp
  f.login("usuario", "usuario"); // usuario y password para conectarnos al ftp
  System.out.println(f.isConnected());
  f.changeWorkingDirectory("diruno"); // Cambiamos de la raiz al subdirectorio uno
  System.out.println(" Crea directorio ? "+f.mkd("dirprueba")); //crea un directorio en diruno
 
  FileInputStream fis = new FileInputStream("archivo.doc"); //Se abre un archivo de nuestra maquina local
  f.setFileType(f.BINARY_FILE_TYPE); //Se pone tipo binario para poder enviar archivos de cualquier tipo
  boolean res = ftpClient.storeFile("/diruno/dirprueba", fis ); //Con esta instruccion se sube el archivo al ftp
  System.out.println("Resultado de subir el archivo es " + res);
 
  FTPFile[] files = f.listFiles(); // Obtiene los archivos del servidor y los mostramos
  for (FTPFile arch : files){
  System.out.println(arch.toString());
  }
 
 
  f.disconnect();
  System.out.println(f.isConnected());
  } catch (IOException ex) {
  ex.printStackTrace();
  }
 }
}

6 comentarios:

no name dijo...

hola amigos tengo un pequeño problema,

me puedo conectar muy bien al servidor ftp(que esta en linux), pero cuando trato de hacer
FTPFile[] files = ftp.listFiles();

para traer la lista de archivos...

no puedo extraerlos despues...

pero mientras que en windows si podia..

alquien me puede ayudar

pueden escribirme a cocketo24@yahoo.es o Diego_e_guerra@hotmail.com

no name dijo...

hola amigo

mr el problema es que cuando el ftp esta en la red local, puedo ver los archivos q contiene el ftp
por ejemplo si le colocamos la direccion 192.....etc es red local

pero si le colocamos un ip publico al mismo ftp, puedo copiar, borrar, crear carpetas pero cuando FTPFile[] files = ftp.listFiles(); para ver los archivos q contiene alguna carpeta no puedo verlos?

me podia ayudar porfavor

me escribe a diego.guerra@sisa.com

slds

Unknown dijo...

hola muy bueno tu aporte, no se si podrias decirnos o colocar un ejemplo de la tranferencia de archivos pues en el api de las librerias no es muy entendible ....

saludos

ramiro dijo...

Muchas Gracias por el aporte, un detalle, en la linea donde colocas:
FileInputStream fis = new FileInputStream("archivo.doc");
Deberias colocarle una ruta, como ser FileInputStream fis = new FileInputStream("c:\\archivo.doc");

y luego donde dice:
ftpClient.storeFile("/diruno/dirprueba", fis );

en tu caso, debe ser:
f.storeFile("/diruno/dirprueba/archivo.doc", fis );

Saludos!

Anónimo dijo...

Hola,

He seguido el mismo ejemplo de transferencia de ficheros y se me crea un fichero en el servidor FTP de tamaño 0. Sabes cual puede ser la razón?

gracias!

neo_lestat dijo...

saludos, no se la razon, pero recuerdo que algo asi me pasaba cuando queria hacerlo en una aplicacion web montada en jboss, asi que tuve que use el objeto URL para subir el archivo, te dejo este link

http://www.ajaxapp.com/2009/02/21/a-simple-java-ftp-connection-file-download-and-upload/