Descargar una carpeta de FTP desde Java (Usando FTPClient Apache Commons Net)

publicado por: Anonymous

No sé cómo descargar una carpeta de un FTP desde Java.

La librería descrita abajo sólo permite la descarga de archivos concretos. Todo el código está basado en FTPClient. Aquí os dejo el método para hacer copias de seguridad de la carpeta “www” de un servidor FTP cualquiera.

/**
 * Metodo que realizara la conexion a traves de FTP Buscara la carpeta "www" y
 * la descargara en el path de destino indicado.
 * 
 * @param host
 *            recibe el host a conectarse
 * @param usr
 *            recibe el user a conectarse
 * @param pass
 *            la contraseña del usuario
 * @param carpetaRemota
 *            la carpeta a la que se le va a hacer la copia
 * @throws InterruptedException
 */

public void metodoBackupFtp(String host, String usr, String pass, String carpetaRemota, String destino) {
    boolean connected, disconnected;
    try {
        FTPClient clienteFtp = new FTPClient();
        System.err.println("Datos de conexiónnHost:" + host + "nUser:" + usr + "nPass:" + pass);
        clienteFtp.connect(host);
        connected = clienteFtp.login(usr, pass);
        clienteFtp.enterLocalPassiveMode();
        clienteFtp.setFileType(FTP.BINARY_FILE_TYPE);
        if (connected) {
            System.out.println("Conectado al FTP!");
            System.err.println("Descarga de carpeta Carpeta Remota: " + carpetaRemota + "Destino: " + pathDestino);
        } else {
            System.err.println("ERROR:Fallo la conexión al FTP => " + host + "n");

        }

        clienteFtp.enterLocalPassiveMode();

        FTPFile[] files = clienteFtp.listFiles();

        String[] sfiles = null;
        if (files != null) {
            sfiles = new String[files.length];
            for (int i = 0; i < files.length; i++) {
                System.out.println(sfiles[i] = files[i].getName());

            }

        }
        // Se descarga el archivo
        Aquí está lo más importante
       //Método por el que pregunto que descargara la carpeta
        disconnected = clienteFtp.logout();
        if (disconnected) {
            System.out.println("Desconectado!");


        }
        clienteFtp.disconnect();
    } catch (SocketException e) {
        System.out.println("ERROR:SocketException");
    } catch (IOException e) {
        System.out.println("ERROR:IOException");

    }
}

En este código tenéis como realizar una conexión básica. Sin embargo el problema viene cuando la librería FTPClient (Descrita en el título) no tiene un método que permita descargar directamente una carpeta.

¿Cómo se puede descargar una carpeta directamente?

solución

SOLUCION:
Esta clase que he hecho permite que se realice la descarga de la carpeta definida en el servidor FTP, por lo que solucionada la duda.

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

/**
* Clase utilizada para realizar la descarga de archivos desde un FTP basado en
* la librería FTPCLient
* 
* @author Hadri
* @version 1.0
*/
public class FTPDown {

/**
 * Descarga un solo archivo del FTP
 *
 * @param clienteFTP
 * 
 * @param pathRemoto
 *            Path del servidor FTP
 * @param archivoLocal
 *            Path del archivo en el que se va a guardar
 * @return true si el archivo se descarga correctamente
 * @throws IOException
 * 
 */

public static boolean retrieveFile(FTPClient clienteFTP, String pathRemoto, String archivoLocal)
        throws IOException {
    DBDataBackup info = new DBDataBackup();
    System.err.println("RetrieveFile");
    System.err.println("Path remoto:" + pathRemoto + "Path guardado: " + archivoLocal);
    info.consoleArea.append("RetrieveFilen");
    info.consoleArea.append("Path remoto:" + pathRemoto + "Path guardado: " + archivoLocal + "n");

    File archivoDescarga = new File(archivoLocal);
    File directorio = archivoDescarga.getParentFile();

    if (!directorio.exists()) {
        info.consoleArea.append("Archivo: " + directorio.getName() + "n");
        directorio.mkdir();
    }
    try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(archivoDescarga))) {
        clienteFTP.setFileType(FTP.BINARY_FILE_TYPE);
        return clienteFTP.retrieveFile(pathRemoto, outputStream);
    } catch (IOException ex) {
        throw ex;
    }
}

/**
 * Descarga un directorio de un FTP
 *
 * @param clienteFtp
 *            El cliente FTP que se va a usar
 * @param directorioRemoto
 *            El directorio que se va a descargar
 *
 * 
 * @param directorioLocal
 *            Path donde se guardara la copia del directorio
 * @throws IOException
 *             Excepción de cualquier error de archivo
 */
public static void retrieveDir(FTPClient clienteFtp, String directorioRemoto, String directorioLocal)
        throws IOException {
    directorioLocal += "/www";
    DBDataBackup info = new DBDataBackup();
    System.err.println("RetrieveDir");
    info.consoleArea.append("RetrieveDirn");
    System.err.println("Path remoto:" + directorioRemoto + "Path guardado: " + directorioLocal);
    info.consoleArea.append("Path remoto:" + directorioRemoto + "Path guardado: " + directorioLocal + "n");
    FTPFile[] ftpFiles = clienteFtp.listFiles(directorioRemoto);
    if (ftpFiles == null || ftpFiles.length == 0) {
        return;
    }
    for (FTPFile ftpFile : ftpFiles) {
        info.consoleArea.append("Directorio: " + ftpFile.getName() + "n");
        String ftpFileNombre = ftpFile.getName();
        if (ftpFileNombre.equals(".") || ftpFileNombre.equals("..")) {

            continue;
        }
        String archivoLocal = directorioLocal + "/" + ftpFileNombre;
        String archivoRemoto = directorioRemoto + "/" + ftpFileNombre;
        if (ftpFile.isDirectory()) {

            File nuevoDirectorio = new File(archivoLocal);
            nuevoDirectorio.mkdirs();

            retrieveDir(clienteFtp, archivoRemoto, archivoLocal);
        } else {

            retrieveFile(clienteFtp, archivoRemoto, archivoLocal);
        }
    }
 }
}

Espero que os sea de utilidad.

Un saludo!

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *