martes, 18 de diciembre de 2012

Conectar a un FTP con PHP para cargar, descargar y eliminar archivos

Contactarse a un servidor FTP y realizar todo tipo de acciones sobre los archivos alojados remotamente es posible gracias a las funciones específicas del leguaje PHP para trabajar con este protocolo. A excepción del comando mget (varios get) prácticamente todo lo que se puede hacer desde una línea de comandos FTP se puede llevar a cabo de una forma muy sencilla, subir y bajar archivos, eliminarlos, listar directorios, etc.

Vamos a ver un pequeño ejemplo en el que realizaremos algunas de las operaciones típicas. Para ello primero establecemos una conexión con el servidor FTP remoto, a continuación iniciamos sesión indicando nuestras credenciales de acceso para poder, primero descargar un archivo remoto, después subir un archivo al servidor, eliminarlo y finalmente listar los archivos ubicados en el directorio raíz del FTP.

$host = 'ftp.servidor-remoto.com';
$user = 'mi_usuario';
$pass = 'mi_contrasena';
$remote_file = 'copia_remota.txt';
$local_file = $_SERVER['DOCUMENT_ROOT'] . '/sitio/copia_local.txt';

//conectarse al host
$conn = @ftp_connect($host);

//Comprobar que la conexión ha tenido éxito
if (!$conn) {
echo 'Error al tratar de conectar con ' . $host . "\n";
exit();
}
echo 'Conectado con ' . $host . "\n";

//Iniciamos sesión
$login = @ftp_login($conn, $user, $pass);
if (!$login) {
echo 'Error al intentar acceder con el usuario ' . $user;
ftp_quit($conn);
exit();
}
echo 'Conectado con el usuario ' . $user . "\n";

//obtenemos el archivo del servidor
if (ftp_get($conn, $local_file, $remote_file, FTP_BINARY)) {
echo 'El archivo ' . $local_file . ' se ha guardado.' . "\n";
} else {
echo 'El archivo ' . $local_file . ' NO se ha guardado.' . "\n";
}

//subimos un archivo al servidor remoto
$remote_file = 'copia_remota.txt';
$local_file = $_SERVER['DOCUMENT_ROOT'] . '/sitio/copia_local.txt';;

if (ftp_put($conn, $remote_file, $local_file, FTP_BINARY)) {
echo 'El archivo ' . $local_file . ' se ha cargado en el servidor remoto.' . "\n";
} else {
echo 'El archivo ' . $local_file . ' NO se ha cargado en el servidor remoto.' . "\n";
}

//borramos el archivo del servidor
if (ftp_delete($conn, $remote_file)) {
echo 'El archivo ' . $remote_file . ' ha sido borrado del servidor.' . "\n";
}

//obtenemos una lista con los archivos del servidor
$files = ftp_nlist($conn, '.');
foreach ($files as $file) {
echo $file . "\n";
}

//Cerramos la conexion
ftp_close($conn);
martes, 7 de diciembre de 2010

Funciones útiles para el manejo de archivos con PHP

Estas son sólo algunas de las funciones para el manejo de archivos nativas en PHP.

file_exists() Comprueba la existencia de un archivo.

$path = $_SERVER['DOCUMENT_ROOT'] . '/directorio/archivo.txt';
if (file_exists($path) {
  //si el archivo existe lo abrimos y lo leemos
  $fp = fopen($path, 'rb');
  while (!feof($fp)) {
    $linea = fgets($fp);
    echo $linea . '<br />'
  }
}

filesize() determina el tamaño en bytes de un archivo.

filesize($_SERVER['DOCUMENT_ROOT'] . '/directorio/archivo.txt');

En PHP no existe una función "delete" para la eliminación física de archivos en el servidor. Para realizar esa tarea el lenguaje pone a nuestra disposición unlink()

unlink($_SERVER['DOCUMENT_ROOT'] . '/directorio/archivo.txt');
miércoles, 11 de agosto de 2010

Leer y escribir un archivo de texto línea a línea con PHP

Un ejemplo de como leer un archivo de texto txt línea por línea con php.

//Abrimos el txt generando un puntero hacia el archivo físico
$fp = fopen("archivo.txt");
//recorremos las diferentes lineas de texto
while (!feof) {
  $line = fgets($fp);
  echo $line . "<br />";
}
fclose($fp);
//importante cerrar el archivo al finalizar

También tenemos a nuestra disposición algunos métodos más para realizar este misma tarea, aunque con cierta funcionalidad extra como son fgetss() y fgetcsv().

//fgetss() elimina todos los tags HTML y PHP que encuentre. 
//Si queremos conservar alguno debemos indicarlo en el
//tercer parámetro, como en el siguiente ejemplo
@$fp = fopen($_SERVER['DOCUMENT_ROOT'].'/ruta/archivo.txt', 'rb');
if ($fp) {
 while (!feof($fp)) {
  echo fgetss($fp, 2096, '<strong><br>').'<br />'; 
 }
 fclose($fp);
} else {
 echo 'Error'; 
}

//fgetcsv() se utiliza para dividir las líneas
//según el caracter de delimitación pasado a la función
//imaginemos un archivo con el siguiente texto:
1,nombre cliente 1,codigo cliente 1,estado cliente 1
2,nombre cliente 2,codigo cliente 2,estado cliente 2
//podemos obtener esta información CSV de la siguiente forma:
$l = 1;
if ($fp = fopen($_SERVER['DOCUMENT_ROOT'].'/ruta/archivo.txt', 'rb')) {
 while ($d = fgetcsv($fp, 2096, ",")) {
  $n = count($d); 
  echo "$n campos en la fila $l<br />";
  $l++;
  for ($i = 0; $i < $n; $i++) {
   echo $d[$i].'<br />'; 
  }
  echo '<br /><br />';
 }
 fclose($fp);

} else {
 echo 'Error'; 
}

Para escribir en un archivo de texto prestamos atención a los modificadores de acceso a ficheros.

"r" => Sólo lectura
"w" => Escritura
"a" => Adición
"r+" "w+" => Lectura y escritura
"b" => Binario (se usa en combinación con alguno de los anteriores, se recomienda para maximizar la portabilidad entre sistemas Linux y Windows.

//Escribir en un archivo una nueva línea
$fp = fopen("archivo.txt", "a");
fputs($fp, "\nTexto a escribir");
fclose($fp);

En realidad fputs() es un alias de fwrite(). Otra opción para leer un archivo con php, es mediante el comando file() con el que no se requiere ningún tipo de puntero hacia el fichero, simplemente abre un archivo y devuelve una matriz con cada línea ocupando una posición. El problema con esta opción llega a la hora de manejar archivos muy grandes ya que pueden generar problemas de memoria. En estos casos siempre es mejor hacerlo accediendo al contenido del fichero línea a línea con fgets() como hemos visto antes.

$salida = "";
$archivo = file("archivo.txt");
foreach ($archivo as $linea) {
  $lineaActual = $linea;
  $salida .= rtrim($lineaActual) . "<br />\n";
}
echo $salida;