在 Java 上下载 FTP 文件夹(使用 FTPClient Apache Commons Net 3.6 API)
Download FTP folder on Java (Using FTPClient Apache Commons Net 3.6 API)
我正在搜索如何使用 java 在 FTP 服务器上下载 "www" 文件夹。
我尝试压缩文件夹,然后使用 FTPClient 中的 "Retrieve file" 方法下载文件,但我找不到某种方法来执行此操作。
感谢您的帮助,谢谢。
我的备份FTP方法代码:
public void metodoBackupFtp(String host, String usr, String pass, String carpetaRemota, String destino)
throws InterruptedException {
// TODO Comprobar si seria posible comprimir el archivo antes de descargarlo
// *Nota al parecer no es posible con
// Ftp client, aun asi se deja el metodo de compresion sin probar
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); // TODO ya se realiza una conexión inicial correcta
clienteFtp.enterLocalPassiveMode();
clienteFtp.setFileType(FTP.BINARY_FILE_TYPE);
if (connected) {
System.out.println("Conectado al FTP!");
JOptionPane.showMessageDialog(frame, "Conectado al FTP => " + host, "Conectado al FTP!",
JOptionPane.INFORMATION_MESSAGE);
System.err.println("Descarga de carpeta Carpeta Remota: " + carpetaRemota + "Destino: " + pathDestino);
} else {
JOptionPane.showMessageDialog(frame,
"No se ha podido establecer una conexión (Revisa los datos de conexión)",
"Fallo la conexión al FTP => " + host, JOptionPane.ERROR_MESSAGE);
}
// Thread.sleep(10000); //Para comprobar que se mantiene la conexion
// Muestra la lista de archivos del raiz FTP en la consola
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());
}
}
disconnected = clienteFtp.logout();
if (disconnected) {
JOptionPane.showMessageDialog(frame, "Desconectado de " + host, "Logout",
JOptionPane.INFORMATION_MESSAGE);
}
clienteFtp.disconnect();
} catch (SocketException e) {
JOptionPane.showMessageDialog(frame, "Fallo la conexión al FTP => " + host, "Error del servidor",
JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
}
}
我这样做class来解决问题。我没有找到任何压缩方法,但我希望它能有所帮助。
对不起一些西班牙变量名称。
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;
/**
* To Download folder from FTP Server using FTPClient library.
*
* @author Hadri
* @version 1.0
*/
public class FTPDown {
/**
* Download a file
*
* @param clienteFTP
*
* @param pathRemoto
* Path FTP
* @param archivoLocal
* Path from file
* @return true if download correctly
* @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;
}
}
/**
* Download folder from FTP
*
* @param clienteFtp
* FTPClient to use
* @param directorioRemoto
* Folder to donwload
*
*
* @param directorioLocal
* Path where it saves
* @throws IOException
* Exception
*/
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);
}
}
}
}
我正在搜索如何使用 java 在 FTP 服务器上下载 "www" 文件夹。 我尝试压缩文件夹,然后使用 FTPClient 中的 "Retrieve file" 方法下载文件,但我找不到某种方法来执行此操作。 感谢您的帮助,谢谢。
我的备份FTP方法代码:
public void metodoBackupFtp(String host, String usr, String pass, String carpetaRemota, String destino)
throws InterruptedException {
// TODO Comprobar si seria posible comprimir el archivo antes de descargarlo
// *Nota al parecer no es posible con
// Ftp client, aun asi se deja el metodo de compresion sin probar
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); // TODO ya se realiza una conexión inicial correcta
clienteFtp.enterLocalPassiveMode();
clienteFtp.setFileType(FTP.BINARY_FILE_TYPE);
if (connected) {
System.out.println("Conectado al FTP!");
JOptionPane.showMessageDialog(frame, "Conectado al FTP => " + host, "Conectado al FTP!",
JOptionPane.INFORMATION_MESSAGE);
System.err.println("Descarga de carpeta Carpeta Remota: " + carpetaRemota + "Destino: " + pathDestino);
} else {
JOptionPane.showMessageDialog(frame,
"No se ha podido establecer una conexión (Revisa los datos de conexión)",
"Fallo la conexión al FTP => " + host, JOptionPane.ERROR_MESSAGE);
}
// Thread.sleep(10000); //Para comprobar que se mantiene la conexion
// Muestra la lista de archivos del raiz FTP en la consola
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());
}
}
disconnected = clienteFtp.logout();
if (disconnected) {
JOptionPane.showMessageDialog(frame, "Desconectado de " + host, "Logout",
JOptionPane.INFORMATION_MESSAGE);
}
clienteFtp.disconnect();
} catch (SocketException e) {
JOptionPane.showMessageDialog(frame, "Fallo la conexión al FTP => " + host, "Error del servidor",
JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
}
}
我这样做class来解决问题。我没有找到任何压缩方法,但我希望它能有所帮助。 对不起一些西班牙变量名称。
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;
/**
* To Download folder from FTP Server using FTPClient library.
*
* @author Hadri
* @version 1.0
*/
public class FTPDown {
/**
* Download a file
*
* @param clienteFTP
*
* @param pathRemoto
* Path FTP
* @param archivoLocal
* Path from file
* @return true if download correctly
* @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;
}
}
/**
* Download folder from FTP
*
* @param clienteFtp
* FTPClient to use
* @param directorioRemoto
* Folder to donwload
*
*
* @param directorioLocal
* Path where it saves
* @throws IOException
* Exception
*/
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);
}
}
}
}