Download an FTP folder from Java (Using FTPClient Apache Commons Net)

0

I do not know how to download a folder from an FTP from Java.

The library described below only allows the download of specific files. The entire code is based on FTPClient . Here is the method to make backup copies of the "www" folder of any FTP server.

/**
 * 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ón\nHost:" + 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");

    }
}

In this code you have how to make a basic connection. However, the problem comes when the FTPClient library (Described in the title) does not have a method to directly download a folder.

How can you download a folder directly?

    
asked by Hadri 08.11.2017 в 10:59
source

1 answer

0

SOLUTION: This class that I have done allows the download of the folder defined in the FTP server, so the doubt has been solved.

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("RetrieveFile\n");
    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("RetrieveDir\n");
    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);
        }
    }
 }
}

I hope you find it useful.

Greetings!

    
answered by 08.11.2017 / 11:03
source