PHP – Subir directorio FTP

Author: Adrià Cidre  |  Category: PHP

A veces es necesario por ejemplo realizar conexiones FTP desde PHP. Por ejemplo necesitamos subir un fichero a un servidor FTP periódicamente, pero no podemos estar pendientes de hacerlo cada día porqué sería una perdida de tiempo.

En estos casos es una buena idea realizar un pequeño script en PHP que haga lo que queramos y posteriormente lo podemos lanzar con un gestor de tareas como CRON (otro día hablaremos de esta fantástica herramienta).

Las funciones ftp que nos proporciona PHP las podéis encontrar aquí.

Sin embargo vamos a hacer un pequeño resumen para tener claras cuales son las más importantes.


# Realizamos la conexión	pasando como parametros el host y el puerto de acceso
$ftpID = ftp_connect('ftp://ftp.misitio.com', 21);

# Si la conexión es segura, necesitaremos facilitar el usuario y la contraseña
ftp_login($ftpID, 'mi_usuario','mi_contraseña');

# Definimos los directorios desde los que moveremos los datos
$path_remoto = '/path_remoto/mi_directorio/';
$path_local = '/path_local/mi_directorio';

# Creamos un directorio con la fecha actual
ftp_mkdir($ftpID, $path_remoto."/".date("Ymd"));

# Subimos el fichero miFichero.txt
ftp_put($ftpID, $path_remoto."/".date("Ymd").'/miFichero.txt', $path_local.'/miFichero.txt', FTP_ASCII);

# Y nos lo volvemos a descargar
ftp_fget  ($ftpID, $path_remoto."/".date("Ymd").'/miFichero.txt', $path_local.'/miFichero.txt', FTP_ASCII)

Entre las funciones que nos facilita PHP, la que más se echa de menos es la de subir un directorio entero. Por este motivo hoy vamos a implementar dicha función.


	# Función recursiva que devuelve un array con la estructura del directorio
	public function leerCarpeta($path)
		{
		$dh = opendir($path);
		$vCarpeta = array();
		while (($fichero = readdir($dh)) !== false)
			{
			if(!(preg_match('/^.{1,2}$/',$fichero)||preg_match('/^.svn[a-z,0-9]*$/',$fichero)))
				{
				if(is_dir($path.'/'.$fichero))
					{
					$vCarpeta[$fichero] = leerCarpeta($path.'/'.$fichero);
					}
				else
					{
					$vCarpeta[] = $fichero;
					}
				}
			}
		return $vCarpeta;
		}	

	# Función recursiva que sube todos los ficheros de un directorio y crea los directorios del mismo.
	public function subirCarpeta($vCarpeta, $path_remoto, $path_local, $ftpID)
		{
		foreach($vCarpeta as $campo=>$valor)
			{
			if(is_array ($valor))
				{
				// Creamos un directorio
				ftp_mkdir($ftpID, $path_remoto.'/'.$campo);
				subirCarpeta($valor, $path_remoto.'/'.$campo, $path_local.'/'.$campo, $ftpID);
				}
			else
				{
				// Submios el fichero
				ftp_put($ftpID, $path_remoto.'/'.$valor, $path_local.'/'.$valor, FTP_ASCII);
				}
			}
		}

	# Probemos el código
	$ftpID = ftp_connect('192.168.0.115',21);
	ftp_login($ftpID,'docseo','comberry');

	$path_local = "/miPath/miDirectorio/";
	$path_remoto = '/miPath/miDirectorioDestino/';

	ftp_mkdir($ftpID, $path_remoto);

	$vCarpetas = leerCarpeta($path_local);
	subirCarpeta($vCarpetas, $path_remoto, $path_local, $ftpID);
	ftp_close($ftpID);

La recursividad siempre es una herramienta compleja y peligrosa, pero utilizada correctamente es de las mas potentes que existen en un lenguaje de programación.

Creo que esto es todo por ahora.