Skip to content

Categories:

Subir y bajar ficheros por FTP

Aquí os pongo unos sencillos métodos para poder subir y/o bajar ficheros por FTP en java, son métodos para transferir ficheros simples, es decir, nos permite transferir un archivo local al servidor, o transferir un archivo del servidor a local, existen librerías que nos dan una funcionalidad completa de FTP pero son propietarias de SUN ú otras compañías, por lo que si pretendemos distribuir nuestra aplicación tendremos que pagar sus respectivas licencias, y con los métodos que aquí os dejo, son 100 % libres.

Bueno ahí va el método para bajar un archivo del servidor FTP a nuestro disco local.

/**
* Método para descargar un archivo en un servidor FTP a un archivo local
* tenemos que pasarle los datos de:
* ip o hostname del servidor
* usuario
* contraseña
* la ruta completa del fichero local donde se escribiran los datos
* la ruta del archivo que queramos bajar en el FTP
* ej: downloadFileByFTP("servidor", "usuario", "contraseña", "c:\\prueba.txt", "/mi_dir/prueba.txt");
*/

public static boolean downloadFileByFTP(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í el que sube un archivo por FTP

/**
* Método para subir un archivo local a un servidor FTP
* tenemos que pasarle los datos de:
* ip o hostname del servidor
* usuario
* contraseña
* la ruta completa del fichero local a subir
* la ruta en donde queramos colocar el archivo en el servidor FTP
* ej: uploadFileByFTP("servidor", "usuario", "contraseña", "c:\\prueba.txt", "/mi_dir/prueba.txt");
*/

public static boolean uploadFileByFTP(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;
}
}

En vista de que habeis tenido algun problema para implementar esta solucion en vuestras aplicaciones os dejo a continuación la clase FTP que contiene los metodos para bajar y subir archivos por ftp desde java y una clase PruebaFTP que tiene un ejemplo de uso (solo teneis que cambiar los datos por los de el servidor ftp y archivos que necesiteis usar.

Clase 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;

/**

*

* @author Daniel Rodriguez Granda

*

*/

public class Ftp {

/**

* Metodo para subir un archivo local a un servidor FTP

* tenemos que pasarle los datos de:

* ip o hostname 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: uploadFileByFTP("servidor", "usuario", "password", "c:\\prueba.txt", "/mi_dir/prueba.txt");

*/

public static boolean uploadFileByFTP(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;

}

}

/**

* Metodo para descargar un archivo en un servidor FTP a un archivo local

* tenemos que pasarle los datos de:

* ip o hostname 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: downloadFileByFTP("servidor", "usuario", "password", "c:\\prueba.txt", "/mi_dir/prueba.txt");

*/

public static boolean downloadFileByFTP(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;

}

}

}

Clase PruebaFTP

/**

*

* @author Daniel Rodriguez Granda

*/

public class PruebaFTP {

public static void main(String args[]) {

// Descargar fichero de un servidor FTP

Ftp.downloadFileByFTP(

"ip_ftp",

"usuario",

"password",

"c:\\ruta_local\\fichero.txt",

"/ruta_ftp/fichero_a_bajar.txt");

// Subir un fichero local a un servidorFTP

Ftp.uploadFileByFTP(

"ip_ftp",

"usuario",

"password",

"c:\\ruta_local\\fichero_a_subir.txt",

"/ruta_ftp/fichero.txt");

}

}

No hay artículos relacionados. Echa un ojo a estos:

    Posted in Sin categoría.


    31 Responses

    Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

    1. Ignacio Sánchez says

      No es por tocar las narices, pero ¿has visto que problemas de seguridad podría llevar eso?

      Saludos

    2. Víctor says

      los problemas de seguridad típicos de un protocolo “FTP”

    3. dave says

      Genial!!, gracias es exactamente lo que buscaba, hermoso deberia de decir, pero una pregunta, que librerias usa?

    4. Coler says

      Gracias, no necesitas instalar ninguna librería, usa las librerías que vienen con la instalación estándar de JAVA, solo tienes que importar lo siguiente:

      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;

      Espero que te sirva, un saludo.

    5. AZ says

      WOW… qedo bien, voy a probarlo… una cosa… lo probaste? es decir lo posteaste y tal cual como lo tienes ahi… funciona?

      gracias. ;)

    6. Coler says

      Gracias por interesarte por el código.

      Te confirmo que funciona perfectamente probado, testado e implantado.

      Saludos.

    7. Diego Troncoso says

      viejo que buen post, gracias a esto me saco de un lio tenaz con un proyeto que tengo, gracias

    8. Daniel says

      Tengo un problema con ese codigo se me pueden ayudar.
      sun.net.ftp.FtpProtocolException: PORT :501 Active mode is disabled

      at sun.net.ftp.FtpClient.openDataConnection(FtpClient.java:435)

    9. Raul says

      Yo tambien tengo el mismo problema de Daniel por favor ayuda

    10. Vanessa says

      Hola me pudieran pasar el codigo completo con todo y el llamado al metodo es que soy nueva en java, pero si tengo un server el cual ocupo implantar este codigo genial, espero me puedan ayudar Gracias.

    11. Vanessa says

      Hola me pasarian todo el programa completo, me refiero a todo con el paso de parametros al metodo es que soy nueva en java y quisiera utilizar este genial codigo pero no he podido pasarle los parametros

    12. Coler says

      En vista de que habeis tenido algun problema para implementar esta solución en vuestras aplicaciones os dejo a continuación la clase FTP que contiene los métodos para bajar y subir archivos por ftp desde java y una clase PruebaFTP que tiene un ejemplo de uso (sólo tenéis que cambiar los datos por los de el servidor ftp y archivos que necesiteis usar.

    13. Freddy says

      Hola, funciona genial la implementacion, logro subir y luego bajar el archivo, pero existe un problema cuando bajo el archivo al parecer regresa distorsionado o con algun fallo no se porque ni en que momento sucede esto si al subir o bajar el archivo. Ejemplo de esto es que subo un archivo .doc que en mi pc lo puedo abrir y leer, pero luego de subirlo y bajarlo deseo abrirlo y dice que el archivo esta dañado o algo asi, que sucede, responde lo antes posible porfavor, muchas gracias

    14. nana says

      tengo una exepcion que te pongo mas abajo…la linea qeu lo marca es la siguiente:
      OutputStream os = urlc.getOutputStream();

      Exception
      java.net.UnknownHostException: 127.0.0.1C
      at java.net.PlainSocketImpl.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at sun.net.NetworkClient.doConnect(Unknown Source)
      at sun.net.NetworkClient.openServer(Unknown Source)
      at sun.net.ftp.FtpClient.openServer(Unknown Source)
      at sun.net.ftp.FtpClient.openServer(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.connect(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.getOutputStream(Unknown Source)
      at http://Ftp.uploadFileByFTP

      AGRADESCO SU AYUDA! me urge deveras!

    15. nana says

      lamento molestarlos de nuevo pero ya he resulto el problema anterior, ahora no se que hacer…la idea es esta…
      tengo un jlist del cual selecciono la direccion que voy a usar en la funcion uploadbyftp…esta direcion es el localpath puesto que los otros valores los he puest por default, uso vectores pero no funciona…alguna idea o me pueden decir en qeu estoy equivocada?

      localPath = (String)vector.elementAt(List.getSelectedIndex());

    16. nana says

      si agrego el “http://” sale al siguiente excepcion
      java.net.UnknownHostException: http
      at java.net.PlainSocketImpl.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at sun.net.NetworkClient.doConnect(Unknown Source)
      at sun.net.NetworkClient.openServer(Unknown Source)
      at sun.net.ftp.FtpClient.openServer(Unknown Source)
      at sun.net.ftp.FtpClient.openServer(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.connect(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.getOutputStream(Unknown Source)
      at http://Ftp.uploadFileByFTP(Ftp.java:27)

      sino le pongo el “http://” sale lo siente:

      java.net.UnknownHostException: localhostC
      at java.net.PlainSocketImpl.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at sun.net.NetworkClient.doConnect(Unknown Source)
      at sun.net.NetworkClient.openServer(Unknown Source)
      at sun.net.ftp.FtpClient.openServer(Unknown Source)
      at sun.net.ftp.FtpClient.openServer(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.connect(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.getOutputStream(Unknown Source)
      at http://Ftp.uploadFileByFTP(Ftp.java:27)

      ya intente con localhost y con 127.0.0.1, el ping funciona…que puede ser el problema?

      les pongo como uso la funcion:
      http://ftp.uploadFileByFTP(“localhost”, “isabel”, “isabel”, localPath, “C:/Users/isabel/Desktop/ftp/” );

      localPath es una variable que almacena la ruta de una variable y si obtiene el dato ya lo comprobe imprimendo ese valor

    17. javid says

      Gracias por el codigo esta excelente todo funciona bien pero solo con archivos *.txt pero con archivos .doc, .pdf, etc, aparentemente sube pero al mmomento de abrirlos sale un mensaje indicando que el archivo esta dañado, o tiene fallos.
      Talvez me pueden ayudar.

    18. Milo says

      Gracias por el Codigo, me fue de mucha utilidad!… Saludos desde GT.

    19. jrpano says

      Hola !!
      Tengo un pequeño prolema con la linea siguiente:

      InputStream is =urlc.getInputStream();

      El error es el siguiente:

      sun.net.ftp.FtpLoginException: password: 331 Anonymous login ok, send your complete email address as your password.

      at sun.net.ftp.FtpClient.login(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.connect(Unknown Source)
      at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
      at DownFileFTP.downloadFileByFTP(DownFileFTP.java:25)
      at Main.main(Main.java:7)

      Creo que es un error de tipos, ya que ‘urlc.getInputStream()’ devuelve un tipo URL Connection, i lo estoy intentando volcar a un objeto del tipo InputStream.

      ¿Puede ser?

      Gracias por vuestra ayuda!!! ;)

    20. jrpano says

      Hola!
      El problema anterior parece que es cuestión del SO, porque en un Win Xp funciona correctamente y en el Win 7 me da error.
      Ahora bien, como ya comento nuestro compañero Freddy, despues de descargarlo no puedo abrirlo.
      Alguien podría decirme el porque?
      Gracias!!

    21. Daniel says

      Gracias por el aporte!
      Tengo una duda, al momento de subir un archivo ‘hola.txt’, este se crea en el servidor con el nombre de archivo y toda su ruta y entonces en lugar de llamarse ‘hola.txt’ se llama ‘c:\hola\hola.txt’ es normal o hay forma de subirlo solo con el nombre y sin la ruta?? Saludos.

    22. Jeison says

      Te felicito por ese codigo yo soy bloggero tambiem; saludos desde colombia

    23. Leandro says

      Tengo una duda con el código, que pasa con los FTPs que necesitan auntenticación TLS Best, como se puede configurar ese parametro en el URL

    24. Coler says

      Este código sólo es valido para servidores FTP sin cifrado de datos, no admite TLS.

    25. john says

      hola para decargar archivos me aparece acceso denegado a la carpeta que hago?

    26. Ignacio Sánchez says

      Es posible que no tengas permisos con el usuario que lo estas haciendo. Revisa ese mismo usuario con un filezilla a ver si funciona

    27. juanjo says

      alguien conoce algún servidor ftp gratuito en el cual pueda probar este programa?

    28. juanjo says

      tema resulto, el problema es que cuando lo descargo esta dañado el fichero, sabeis porque? este programa funcionaria con cualquier tipo de archivos, por ejemplo:.jpg,,pdf,.rar
      etc…

    29. juanjo says

      por cierto el type=i, para que es?

    30. JOE says

      Hola, primero de todo felicitar al que ha hecho este programa, me sirvió bastante para un trabajo,jeje. Tienes razón ignacio con el tema de problemas de seguridad, pero bueno, es un programa básico que realiza su tarea como toca.
      Con los .txt funciona de maravilla pero, si que es verdad que hay un pequeño problema con el tema de subir y descargar archivos multimedia (jpg,mpeg,..). El tema es que cuando se usa BufferedReader o Writer, lee o escribe el archivo en ASCII (eso da problemas con los archivos multimedia). Solución, enviarlos o descargarlos en binario (consultar API Java).

    31. Eduardo says

      hola disculpa mi abuso podrias publicar un ejemplo de la escritura del archivo en binario utilizando este mismo que esta publicado ya que tengo ese mismo problema y no entiendo bien como plantear la solucion



    Some HTML is OK

    or, reply to this post via trackback.