Descarga FTP desde Java
Hoy vamos a ver como descargar un archivo de un servidor FTP desde Java. El proceso requiere de la libreria apache commons .net (no crean que es el .net de microsoft...) se descarga de la direccion: http://commons.apache.org/net/download_net.cgi . Lo que se descarga es una librería que tiene varios paquetes, entre ellos vamos a usar org.apache.commons.net.ftp.FTP, org.apache.commons.net.ftp.FTPClient, org.apache.commons.net.ftp.FTPFile. La descarga del archivo se hace de la siguiente manera:
public File getArchivoFTP(String nombreArchivo) {
File f_retorno = null;
FTPClient ftp = new FTPClient();
int respuesta;
String ps_ip = this.IP_FTP;
String ps_archivo = nombreArchivo;
String ps_usuario = this.USUARIO_FTP;
String ps_password = this.PASSWORD_FTP;
try {
// establecer conexion
String ruta_pdf_local = this.RUTA_DESTINO;
ftp.connect(ps_ip);
if (!ps_usuario.equals("") && !ps_password.equals("")) {
ftp.login(ps_usuario, ps_password);
respuesta = ftp.getReplyCode();
if (respuesta == 230) {
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.changeWorkingDirectory(this.RUTA_FUENTE);
respuesta = ftp.getReplyCode();
if (FTPReply.isPositiveCompletion(respuesta)) {
FTPFile archivosFTP[] = ftp.listFiles();
respuesta = ftp.getReplyCode();
if (FTPReply.isPositiveCompletion(respuesta)) {
if (archivosFTP.length > 0) {
for(int i=0; i< archivosFTP.length; i++){
String nombre = archivosFTP[i].getName();
if (nombre.equals(ps_archivo)) {
String archivo_salida = ruta_pdf_local
+ File.separator
+ archivosFTP[i].getName();
boolean retorno_download = ftp
.retrieveFile(archivosFTP[i]
.getName(),
new FileOutputStream(
archivo_salida));
if (retorno_download) {
f_retorno = new File(archivo_salida);
if (!(f_retorno.length() > 0)) {
System.out
.println("Advertencia: Archivo con longitud 0");
f_retorno = null;
}
} else {
System.out
.println("No se pudo descargar en: "
+ archivo_salida);
}
}
if (f_retorno != null) {
break;
}
}
if (f_retorno == null) {
System.out
.println("No se pudo descargar el archivo: "
+ ps_archivo);
}
} else {
System.out
.println("Listado de archivos de longitud invalida -"
+ archivosFTP.length);
}
} else {
System.out
.println("No se pudo listar el directorio -");
}
} else {
System.out
.println("No se pudo cambiar de directorio -");
}
} else {
System.out.println("No se pudo autenticar -");
}
} else {
System.out.println("Login y password invalidos -");
}
} catch (SocketException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
ftp.disconnect();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return f_retorno;
Después de ubicarte en el directorio que deseas en el FTP, también puedes listar el contenido de un directorio FTP, de esta forma:
FTPFile[] archivosFTP = ftp.listFiles();
if (archivosFTP.length > 0){
for(FTPFile arch : archivosFTP){
String ls_nombre_archivo = arch.getName();
System.out.println(ls_nombre_archivo);
}
}
public File getArchivoFTP(String nombreArchivo) {
File f_retorno = null;
FTPClient ftp = new FTPClient();
int respuesta;
String ps_ip = this.IP_FTP;
String ps_archivo = nombreArchivo;
String ps_usuario = this.USUARIO_FTP;
String ps_password = this.PASSWORD_FTP;
try {
// establecer conexion
String ruta_pdf_local = this.RUTA_DESTINO;
ftp.connect(ps_ip);
if (!ps_usuario.equals("") && !ps_password.equals("")) {
ftp.login(ps_usuario, ps_password);
respuesta = ftp.getReplyCode();
if (respuesta == 230) {
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.changeWorkingDirectory(this.RUTA_FUENTE);
respuesta = ftp.getReplyCode();
if (FTPReply.isPositiveCompletion(respuesta)) {
FTPFile archivosFTP[] = ftp.listFiles();
respuesta = ftp.getReplyCode();
if (FTPReply.isPositiveCompletion(respuesta)) {
if (archivosFTP.length > 0) {
for(int i=0; i< archivosFTP.length; i++){
String nombre = archivosFTP[i].getName();
if (nombre.equals(ps_archivo)) {
String archivo_salida = ruta_pdf_local
+ File.separator
+ archivosFTP[i].getName();
boolean retorno_download = ftp
.retrieveFile(archivosFTP[i]
.getName(),
new FileOutputStream(
archivo_salida));
if (retorno_download) {
f_retorno = new File(archivo_salida);
if (!(f_retorno.length() > 0)) {
System.out
.println("Advertencia: Archivo con longitud 0");
f_retorno = null;
}
} else {
System.out
.println("No se pudo descargar en: "
+ archivo_salida);
}
}
if (f_retorno != null) {
break;
}
}
if (f_retorno == null) {
System.out
.println("No se pudo descargar el archivo: "
+ ps_archivo);
}
} else {
System.out
.println("Listado de archivos de longitud invalida -"
+ archivosFTP.length);
}
} else {
System.out
.println("No se pudo listar el directorio -");
}
} else {
System.out
.println("No se pudo cambiar de directorio -");
}
} else {
System.out.println("No se pudo autenticar -");
}
} else {
System.out.println("Login y password invalidos -");
}
} catch (SocketException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
ftp.disconnect();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return f_retorno;
Después de ubicarte en el directorio que deseas en el FTP, también puedes listar el contenido de un directorio FTP, de esta forma:
FTPFile[] archivosFTP = ftp.listFiles();
if (archivosFTP.length > 0){
for(FTPFile arch : archivosFTP){
String ls_nombre_archivo = arch.getName();
System.out.println(ls_nombre_archivo);
}
}
Se me hace muy revuelto y no veo donde se declare la variable i para llenar el array
ResponderEliminarfor(int i=0; i< archivosFTP.length; i++)
EliminarGracias Josué, muy útil!
ResponderEliminar