jueves, 20 de enero de 2011

FTP en JAVA

Es un código muy sencillo, solo necesitamos implementar una clase FTP la cual realice la conexión con el servidor y suba o baje el fichero. El inconveniente es que soy un poco novato así que el código solo sube ficheros de tamaño pequeño, no sería capaz de subir un paquete comprimido con todas las fotos de nuestro PC al servidor. Si alguien estaría interesado en echarme un cable se lo agradecería.

Esta seria la clase a implementar en el proyecto la llamaremos Ftp

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

public class Ftp {
/**
* Sube un archivo local a un servidor FTP
* le pasamos:
* ip o host del servidor
* usuario
* password
* la ruta completa del fichero local a subir
* la ruta en donde queramos colocar el archivo en el servidor FTP
* ej: uploadFile("servidor", "usuario", "password", "c:\\prueba.txt", "/mi_dir/prueba.txt");
*/
public static boolean uploadFile(String server, String user, String pass, String localPath, String remotePath) {

  try {
  URL url = new URL("ftp://" + user + ":" + pass + "@" + server + remotePath + ";type=i");
  URLConnection urlc = url.openConnection();
  OutputStream os = urlc.getOutputStream();
  BufferedReader br = new BufferedReader(new FileReader(localPath));
  int c;
  while ((c = br.read()) != -1) {
     os.write(c);
  }

  os.flush();
  os.close();
  br.close();
  return true;
  } catch (Exception ex) {
     ex.printStackTrace();

  return false;}
  }

/**
* Descarga un archivo en un servidor FTP a un archivo local
* le pasamos:
* ip o host del servidor
* usuario
* password
* la ruta completa del fichero local donde se escribiran los datos
* la ruta del archivo que queramos bajar en el FTP
* ej: downloadFile("servidor", "usuario", "password", "c:\\prueba.txt", "/mi_dir/prueba.txt");
*/
public static boolean downloadFile(String server, String user, String pass, String localPath, String remotePath) {
try {
  URL url = new URL("ftp://" + user + ":" + pass + "@" + server + remotePath + ";type=i");
  URLConnection urlc = url.openConnection();
  InputStream is = urlc.getInputStream();
  BufferedWriter bw = new BufferedWriter(new FileWriter(localPath));
  int c;
  while ((c = is.read()) != -1) {
     bw.write(c);

  }
  is.close();
  bw.flush();
  bw.close();
  return true;
} catch (Exception ex) {
  ex.printStackTrace();
  System.out.println(ex.getMessage());
return false;}
 }
}

y aquí os enseño un ejemplo de como usarlo en la aplicación.

-Descargar fichero de un servidor FTP
Ftp.downloadFile("ip_ftp","usuario","password","c:\\ruta_local\\fichero.txt","/ruta_ftp/fichero_a_bajar.txt");

-Subir un fichero local a un servidor FTP
Ftp.uploadFile("ip_ftp","usuario","password","c:\\ruta_local\\fichero_a_subir.txt","/ruta_ftp/fichero.txt");
Un pequeño "consejo" sería meterlo en un bucle para comprobar cuando a terminado el proceso, ejemplo:
boolean terminado= Ftp.downloadFile("ip_ftp","usuario","password","c:\\ruta_local\\fichero.txt","/ruta_ftp/fichero_a_bajar.txt");
while(terminado){
      System.out.println("Archivo descargado correctamente");
 break;
}
un saludo ;)

3 comentarios:

  1. Este error es el que sale java.net.MalformedURLException: For input string:"clave"

    al aplicar : Ftp.uploadFile("ip_ftp","usuario","password","c:\\ruta_local\\fichero_a_subir.txt","/ruta_ftp/fichero.txt");

    ResponderEliminar
  2. según puedo leer, el error es en la cadena "clave" no se si es el error completo. Comprueba que este bien el String.

    Es lo que se me ocurre si no envia el error completo, para que te pueda echar una mano

    un saludo

    ResponderEliminar
  3. descarga el nombre del archivo, mas no el archivo fisico.

    ResponderEliminar