Skip to content


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.
[code lang=»java»]
/**
* 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;
}
}
[/code]

Y aquí el que sube un archivo por FTP
[code lang=»java»]
/**
* 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;
}
}
[/code]

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

[code lang=»java»]
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;

}

}

}

[/code]

Clase PruebaFTP

[code lang=»java»]

/**

*

* @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»);

}

}

[/code]

Posted in Java.

Tagged with , , , .


43 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

  32. sr_x says

    Aqui esta un ejemplo de como se debe leer el archivo en binario y mandarlo en binario.

    byte bytes[] = new byte[1024];
    int readCount = 0;

    while( (readCount = fileInputStream.read(bytes)) > 0)
    ftpOutputStream.write(bytes, 0, readCount);

    Disculpen las molestias, lo que pasa es que en mi caso , cuando subo un archivo a un servidor ftp con windows NT, y despues trato de najarlo con el comando ftp desde un bsd, me dice que no tengo permisos para bajar el archivo, si lo bajo con el plugin de firefox fireftp si lo baja bien, alguien tiene alguna idea de por que pasa eso?
    Gracias.

  33. asegura96 says

    Hola.
    Adaptando un poco el codigo, si pude escribir el el archivo bien el ftp y pude lograr visualizarlo.

    InputStream inp = null;
    File fichero = new File(localPath);
    inp = new FileInputStream(fichero);
    byte bytes[] = new byte[1024];
    int readCount = 0;

    while ((readCount = inp.read(bytes)) > 0) {
    os.write(bytes, 0, readCount);
    }
    os.flush();
    os.close();
    inp.close();

    Saludos

  34. noelia says

    hola xfa necesito saver xq me sale el siguiente error
    «CWD acct:550 Failed to change directory.»

  35. Mirta says

    java.net.MalformedURLException me sale este error cuando lo pruebo.. ke puedo hacer???

  36. Andres says

    hola a todos, impklenete el codigo y estoy tratando de subir un archivo pdf al servidor funciona pero cuando abro el archivo que subi esta en blanco me pueden atyudar por favor

  37. Erick says

    CWD SICAT:550 The system cannot find the file specified.

  38. ktrillo says

    Hola, esta muy bueno tu post, nose si sabes como hacer lo mismo para videos en cualquier formato: avi, mov, etc. Necesito ayuda con esto, es URGENTE!. Gracias

  39. manuel hernandez says

    buenas tardes estoy desarrollando un programa en el cual suba y descargue archivos desde un ftp, este programa funciona bn en windows xp, el sube y descarga perfecto, ahora quiero ponerlo a funcionar y sube perfecto pero cuando quiero desdcargar el me descarga pero no me abre el archivo que puede pasar agradezco su atencion y espero una pronta respuesta.

  40. Renan says

    Gracias me funciono perfectamente!! justo lo que buscaba!!

  41. devanwilk says

    me gusto el tip, ya hice mi propio cliente ftp en java gracias, pero falta como eliminar desde el servidor algun archivo que quiera suprimir, gracias.

  42. Jony says

    Tengo un problema al comparar el != -1 me marca error :'( saludos.

Continuing the Discussion

  1. FTP con Java | Biblioteca personal de Santiago Pastor linked to this post on 21 julio 2014

    […] tienes la necesidad de usar FTP con Java, este artículo te ayudará, sin duda alguna, a realizar clases reutilizables para usar dicho […]