4.5 Manejo de archivos

Hasta el momento almacenamos datos en constantes, variables y arreglos este almacenamiento es temporal y se pierde cuando termina la ejecución del programa. La solución computacional es almacenar dichos datos en una fuente de almacenamiento secundario como por ejemplo un disco duro o pendrive entre otros medios a fin de que persistan aun después de la ejecución del programa que los crea y puedan ser usados inclusive por otros programas.

Para lograr esto los datos se almacenan en un recipiente llamado archivo, el procesamiento de archivos es una herramienta invaluable de programación. Existen diversos tipos de archivos y su descripción escapa del alcance de este curso.

Sin embargo, mis caros y estimados lectores simplemente cualquier cosa almacenada en su disco duro, en su pendrive o cualquier medio de almacenamiento es un archivo.

Los archivos que PHP pueden ser secuenciales y binarios. Los archivos secuenciales son archivos de texto y los binarios pueden almacenar gráficos y diversos formatos de información. Básicamente responden a las siguientes operaciones:


Desde las operaciones básicas como copiar, mover y eliminar, hasta operaciones que exigen una cierta complejidad son requeridas para la configuración de páginas Web.


Función Descripción Sintaxis
copy Copia un archivo copy($origen, $destino)
rename Cambia el nombre del archivo de $antes a $despues rename($antes, $despues)
unlink Borra el archivo unlink($archivo)

Manejo de imagenes

Ejemplo: Mostrar la totalidad de las imagenes de una carpeta




<?php  
  if ($gestor = opendir('../imagenes')) { 
    // Abre un gestor de directorios
    echo "<table border=1 align='center'>";
    echo "<tr>";
    $i=0;
    while (false !== ($archivo = readdir($gestor))) {
      //readdir: Lee un elemento del directorio 
      //$gestor abierto previamente 
      //con opendir y desplaza el puntero al elemento siguiente
      if ($archivo != "." and $archivo != "..") { 
        //checa que no sea subdirectorio
        $extension = strtolower(substr($archivo, -4));
        //strlower pasa a minuscula una cadena en este caso
        //los 4 últimos caracteres
        //de la cadena
        if (($extension == '.jpg') or ($extension == '.gif') 
             or ($extension == '.png')) {           
          if ($i==4) {// Cuatro imagenes por renglón
            $i=0;
            echo "</tr>";
            echo "<tr>";
          }
          $i++;
          echo "<td>";
          echo "<a href='../imagenes/$archivo'>";
          echo "<img src='../imagenes/$archivo'";
          echo "border='0' ></a>";
          echo "</td>";
        }
      }
    }
    echo "</tr>";
    echo "</table>";
    closedir($gestor); //Cierra el gestor
  }	
?>

Ejemplo:

<?php
  echo "<table border=1 align='center'>";
  echo "<tr>";
  $i = 0;
  //carga las imagenes de la carperta
  //La función glob() realiza una búsqueda por todos los nombres
  //de ruta que coincidan con patrón 
  $ruta = "../imagenes/";
  $imagenes = glob($ruta . "{*.jpg, *.gif, *.png}", GLOB_BRACE);
  sort($imagenes); 
  //Recorre el vector 
  foreach($imagenes as $foto){  
   if ($i==4) {
      $i=0;
      echo "</tr>";
      echo "<tr>";
   }
   $i++;
   echo "<td><a href='".$foto."'><img src='".$foto."/></a></td>";
  }
  echo "</tr>";
  echo "</table>";	  
?>

Para el siguiente ejemplo usaremos 4 funciones básicas de manipulación de archivos

Función Descripción Sintaxis
filesize Obtiene el tamaño del archivo filesize($archivo);
fopen Abre un archivo y le asigna un identificador id. $id = fopen($archivo, $modo);
fpassthru Lee completamente el archivo y lo muestra. El cierre del archivo es automático al terminar el volcado del archivo. fpassthru($id);
header Permite modificar las cabeceras que envía el servidor al navegador. Estas cabeceras, que siguen el protocolo HTTP, es la primera información que recibe el navegador en cada petición que realiza, antes que el contenido del archivo. header("mensaje");

Ejemplo: Mostrar una imagen

fopen además de abrir un archivo, obtiene un apuntador a su contenido. fopen solo debe usarse para abrir un archivo cuyo contenido vamos a manipular. Si unicamente queremos recuperar su contenido (y por ejemplo mostrarlo en pantalla), hay otras funciones más adecuadas.

Los modos en los que se puede abrir un archivo son:


Las líneas 7 y 8 envían cabeceras HTTP para indicar el tamaño y formato del archivo.

fpassthru (línea 11) hace un volcado del archivo previamente definido en la línea 4.

<?php
   // Abree el archivo en modo binario
   $imagen = '../images/moneda.jpg';
   $id = fopen($imagen, 'rb');

   // Envia las cabeceras. Note que depende de la extensión de la imagen
   header('Content-Type: image/jpeg');
   header('Content-Length: ' . filesize($imagen));

   // imprime el archivo y detiene el script
   fpassthru($id);
   exit;
?>

Una versión reducida de este código lo podemos encontrar en:

La función file_get_contents (línea 4) permite leer el contenido de un archivo en una cadena.

<? 
  header( "Content-type: image/jpeg");
  $archivo = '../images/moneda.jpg';  
  $imagen = file_get_contents($archivo); 
  echo $imagen; 
?>

Leer un archivo de texto


<?php
  header('Content-Type: text/html; charset=iso-8859-1');    
  try {
	$archivo = '0450alumnos.txt';

    if ( !file_exists($archivo) ) {
      throw new Exception('Archivo no encontrado.');
    }
  
    $fp = fopen($archivo, 'r');
      if ( !$fp ) {
        throw new Exception('Falla al abrir el archivo.');
      }
	  
    while(! feof($fp)) { 
      echo fgets($fp). '<br>';
    }
    fclose($fp);
  } catch(Exception $e) {
	  echo 'Mensaje: ' .$e->getMessage();
  } 
?>

Otra forma de hacerlo es mediante la función fread (línea 6) la cual lee el contenido de un archivo.


<?php
  header('Content-Type: text/html; charset=iso-8859-1');
  try {
	$archivo = '0450alumnos.txt';

    if ( !file_exists($archivo) ) {
      throw new Exception('Archivo no encontrado.');
    }
    $fp = fopen($archivo, 'r');
    if ( !$fp ) {
        throw new Exception('Falla al abrir el archivo.');
    }	
	$contenido = fread($fp, filesize($archivo));
    echo $contenido;
    fclose($id);
  } catch(Exception $e) {
	  echo 'Mensaje: ' .$e->getMessage();
  } 
?>

Contador de visitas


<?php
 /***********************************************************
  * Contador de visitas programado en PHP     ***************
  * Modificado Jose Evaristo Pacheco Velasco  ***************
  * Mas utilidaddes para webmsters en www.desenredate.com  **
  ***********************************************************/
  $destino = '0450visitante.dat';
  if(!file_exists($destino)) { // si el archivo no existe lo crea
     $abrir = fopen($destino, 'w');
     $cuenta = '';
  } else {
     $abrir = fopen($destino,'r');
     $cuenta = trim(fread($abrir,filesize($destino)));
  }
  if($cuenta != '') $cuenta++; else $cuenta = 1;
  fclose($abrir);
  $abrir = fopen($destino,'w');
  fputs($abrir, $cuenta);
  echo "<p align='text-center'>Eres el visitante:</p>";
  // Imprime contador 
  for($i = 0; $i < strlen($cuenta); $i++) {
    $imagen = substr($cuenta, $i, 1);
    $contador .= "<img alt='$imagen ' src='$imagen.gif'>";
  }
  fclose($abrir);
  echo "<p align='text-center'> $contador </p>";
?>