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]
No es por tocar las narices, pero ¿has visto que problemas de seguridad podría llevar eso?
Saludos
los problemas de seguridad típicos de un protocolo «FTP»
Genial!!, gracias es exactamente lo que buscaba, hermoso deberia de decir, pero una pregunta, que librerias usa?
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.
WOW… qedo bien, voy a probarlo… una cosa… lo probaste? es decir lo posteaste y tal cual como lo tienes ahi… funciona?
gracias. 😉
Gracias por interesarte por el código.
Te confirmo que funciona perfectamente probado, testado e implantado.
Saludos.
viejo que buen post, gracias a esto me saco de un lio tenaz con un proyeto que tengo, gracias
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)
Yo tambien tengo el mismo problema de Daniel por favor ayuda
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.
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
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.
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
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!
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());
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
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.
Gracias por el Codigo, me fue de mucha utilidad!… Saludos desde GT.
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!!! 😉
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!!
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.
Te felicito por ese codigo yo soy bloggero tambiem; saludos desde colombia
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
Este código sólo es valido para servidores FTP sin cifrado de datos, no admite TLS.
hola para decargar archivos me aparece acceso denegado a la carpeta que hago?
Es posible que no tengas permisos con el usuario que lo estas haciendo. Revisa ese mismo usuario con un filezilla a ver si funciona
alguien conoce algún servidor ftp gratuito en el cual pueda probar este programa?
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…
por cierto el type=i, para que es?
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).
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
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.
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
hola xfa necesito saver xq me sale el siguiente error
«CWD acct:550 Failed to change directory.»
java.net.MalformedURLException me sale este error cuando lo pruebo.. ke puedo hacer???
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
CWD SICAT:550 The system cannot find the file specified.
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
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.
Gracias me funciono perfectamente!! justo lo que buscaba!!
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.
Tengo un problema al comparar el != -1 me marca error :'( saludos.