Trabajando con PHP y ficheros

En este nuevo tutorial, voy a tratar el tema de los ficheros y como se trabaja en ellos desde PHP. No va a ser exhaustivo ni mucho menos, pretende proporcionaros las bases para que experimentéis por vuestra cuenta y riesgo. Vamos a aprender unas cuantas cosas útiles al respecto de los ficheros, así que, si estáis listos, empezamos. Para este tutorial solo váis a necesitar PHP, nada más (ni MySQL ni otra cosa).

Abriendo un fichero de texto, lectura, escritura y añadido

Lo primero que vamos a hacer es escribir un sencillo fichero de texto. Lo abriremos, escribiremos un par de líneas dentro de él y luego lo cerraremos. El código que realiza esto se puede ver a continuación.

<? 

#Abrimos el fichero en modo de escritura 
$DescriptorFichero = fopen("fichero_prueba.txt","w"); 

#Escribimos la primera línea dentro de él 
$string1 = "Esta es la primera línea de texto
"; 
fputs($DescriptorFichero,$string1); 

#Escribimos la segunda línea de texto 
$string2 = "Y esta es la segunda línea de texto
"; 
fputs($DescriptorFichero,$string2); 

#Cerramos el fichero 
fclose($DescriptorFichero); 

?> 

Así pues, el script anterior lo único que hace es abrir un fichero llamado fichero_prueba.txt, y escribe dentro de él dos líneas de texto. Os habréis fijado en el de detrás de las líneas de texto, en las variables $string1 y $string2. Esto se debe a que, si no estuviese puesto, el programa escribiría todo seguido. Para comprobarlo, quitadlo y ejecutad de nuevo el programa. Con solo no sirva, al menos en mi sistema Windows 2000. :-) En Linux, basta con un .

Otra de las cosas importantes del anterior script es algo que quizás no hayamos visto de cerca. Fijémonos en la siguiente línea:

$DescriptorFichero = fopen("fichero_prueba.txt","w");

La función fopen sirve para abrir un fichero en un modo. Los modos pueden ser seis y son los siguientes. Además de listarlos, explicaré las diferencias (no siempre tan obvias), al respecto de ellos.

Modo de apertura Qué significa
r Modo de solo lectura. Se abre el fichero y el cursor se coloca al principio del mismo, permitiendo leerlo hasta el final.
r+ Modo de lectura/escritura. Se abre el fichero y el cursor se coloca al principio del mismo,permitiendo leer o escribir en el fichero.
w Modo de solo escritura. Se crea el fichero si no existiese, y, si existe, se borra todo su contenido, se sitúa el cursor al principio del fichero permitiendonos escribir.
w+ Modo de escritura/lectura. Si el fichero no existe, se crea, y, si existiese, se borra todo su contenido, se sitúa el cursor al principio del fichero permitiéndonos escribir y leer.
a Modo de añadido. Abre el fichero, sitúa el cursor al final del mismo y permite escribir. Si el fichero no existe, lo crea, pero, en caso de existir, no borra su contenido.
a+ Modo de añadido/lectura. Sitúa el cursor al final del fichero y permite escribir y leer. Si el fichero no existe, lo crea, pero, si existe, no borra su contenido.

Así pues, estos son los seis modos de abrir un fichero. Vamos ahora a ver un ejemplo en código del uso de los mismos. El siguiente script va a hacer las siguientes tareas:

  • Crear un fichero y escribir en él dos líneas de texto.
  • Abrir el fichero de nuevo, esta vez en modo añadido, y escribir otras dos líneas.

Es poco, pero la lectura de ficheros la veremos al final de esta parte del tutorial. De momento, aquí está el código del script de PHP.

escribir2.php

<? 

#Abrimos el fichero en modo de escritura 
$DescriptorFichero = fopen("fichero_prueba.txt","w"); 

#Escribimos la primera línea dentro de él 
$string1 = "Esta es la primera línea de texto
"; 
fputs($DescriptorFichero,$string1); 

#Escribimos la segunda línea de texto 
$string2 = "Y esta es la segunda línea de texto
"; 
fputs($DescriptorFichero,$string2); 

#Cerramos el fichero 
fclose($DescriptorFichero); 

#Volvemos a abrir el fichero, esta vez en modo de añadir 
$Descriptor2 = fopen("fichero_prueba.txt","a"); 

#Añadimos la tercera línea de texto 
fputs($Descriptor2,"Esta es la tercera línea, añadida con modo "a"
"); 

#Añadimos la cuarta línea de texto 
fputs($Descriptor2,"Esta es la cuarta línea, añadida con modo "a"
"); 

#Cerramos el fichero 
fclose($Descriptor2); 

?>

Como podéis comprobar si abrís el fichero recién creado, éste contiene cuatro líneas, dos de ellas escritas con modo "w" y otras dos con modo "a". Si ya tenéis más o menos claro como funciona, vamos a pasar a ver dos funciones muy útiles para leer ficheros de texto: fgets() y feof(). A través de fgets() podemos leer una línea del fichero de texto cada vez. feof() sirva para saber si hemos llegado al final del fichero. Para ver como funcionan, crearemos un script que leerá el fichero que hemos creado con los dos scripts anteriores.

leer.php

<? 

#Abrimos el fichero en modo lectura 
$DescriptorFichero = fopen("fichero_prueba.txt","r"); 

#Hasta que no lleguemos al final del fichero 
while(!feof($DescriptorFichero)){ 

    #Capturamos 4096 caracteres dentro de la línea, 
    #o menos si hay un retorno de carro antes 
    #(
 en Win32, 
 en UNIX) 
    $buffer = fgets($DescriptorFichero,4096); 

    #Soltamos el texto, añadiendo <BR> detrás 
    echo $buffer."<BR>"; 
} 

?>

Como véis, este script lee el fichero de texto línea a línea y lo va mostrando en el navegador. La función feof() devuelve TRUE cuando ha llegado al final del fichero. fgets(), va, pues, leyendo linea a linea y almacenándolo en una varible llamada $buffer.

Ahora vamos a ver como funcionan los modos w+, r+ y a+. Veréis que son diferentes de los anteriores en el sentido de que permiten dos operaciones, y tambien en el sentido de como tratan los ficheros. Empezaremos con w+. El siguiente script explica qué es lo que hace este modo con los ficheros.

leer_wplus.php

<? 

#Abrimos el fichero en modo w+ 
$Descriptor1 = fopen("nuevo_fichero.txt","w+"); 

#Vamos a escribir un par de líneas en el fichero 
fputs($Descriptor1,"Esta es la primera línea de texto
"); 
fputs($Descriptor1,"Esta es la segunda línea de texto
"); 

#Ahora cerraremos el fichero 
fclose($Descriptor1); 

#Volvemos a abrirlo en modo w+ 
$Descriptor2 = fopen("nuevo_fichero.txt","w+"); 

#Escribimos un par de líneas 
fputs($Descriptor2,"Esta es la tercera línea de texto
"); 
fputs($Descriptor2,"Esta es la cuarta línea de texto
"); 

#Volvemos al principio del fichero 
rewind($Descriptor2); 

#Vamos leyendo líneas y mostrándolas 
while(!feof($Descriptor2)){ 

    $buffer = fgets($Descriptor2,4096); 
    echo $buffer."<BR>"; 

} 

#Cerramos el fichero 
fclose($Descriptor2); 

?>

Como véis, al ejecutarlo, el resultado es el siguiente:

Esta es la tercera línea de texto
Esta es la cuarta línea de texto

¿Por qué no aparecen la primera y la segunda línea escritas? Observemos lo que hemos hecho. Primero abrimos el fichero y escribimos dentro de él dos líneas de texto. Tras esto, lo cerramos y lo volvemos a abrir, en modo w+. Este modo BORRA EL CONTENIDO ANTERIOR del fichero, por lo que en este solo aparecen las dos últimas líneas. Como véis, se puede utilizar este modo para leer desde el fichero con fgets().

Ahora vamos a ver un ejemplo con r+. Vamos a crear un script que haga lo mismo que el anteriro, pero en vez de abrir los ficheros con w+, los abrirá con r+.

leer_rplus.php

<? 

#Abrimos el fichero en modo w+ 
$Descriptor1 = fopen("nuevo_fichero.txt","w"); 

#Vamos a escribir un par de líneas en el fichero 
fputs($Descriptor1,"Esta es la primera línea de texto
"); 
fputs($Descriptor1,"Esta es la segunda línea de texto
"); 

#Ahora cerraremos el fichero 
fclose($Descriptor1); 

#Volvemos a abrirlo en modo w+ 
$Descriptor2 = fopen("nuevo_fichero.txt","r+"); 

#Escribimos un par de líneas 
fputs($Descriptor2,"Esta es la tercera línea de texto
"); 
fputs($Descriptor2,"Esta es la cuarta línea de texto
"); 

#Volvemos al principio del fichero 
rewind($Descriptor2); 

#Vamos leyendo líneas y mostrándolas 
while(!feof($Descriptor2)){ 

    $buffer = fgets($Descriptor2,4096); 
    echo $buffer."<BR>"; 

} 

#Cerramos el fichero 
fclose($Descriptor2); 

?>

Si ejecutáis el script, quizás observéis, sorprendidos, que el resultado es el mismo que en el anterior. Pero lo que ha sucedido, en cambio, no es lo mismo. Vamos a anlizarlo por partes. Primero, hemos abierto el fichero en modo w (escritura), para meter dos líneas en el fichero. Tras esto, lo cerramos, y lo abrimos en modo r+ (lectura/escritura). Al abrirlo de este modo, el cursor se sitúa al principio del fichero, por lo que al escribir las siguientes dos líneas, borra el contenido de las dos líneas anteriroes.. Antes de mostrar el contenido del fichero usamos la función rewind(), que rebobina el cursor hasta el principio del fichero. Para añadir al final de fichero, necesitamos el modo a+, como veremos en el siguiente ejemplo.

leer_aplus.php

<? 
#Abrimos el fichero en modo w+ 
$Descriptor1 = fopen("nuevo_fichero.txt","w+"); 

#Vamos a escribir un par de líneas en el fichero 
fputs($Descriptor1,"Esta es la primera línea de texto
"); 
fputs($Descriptor1,"Esta es la segunda línea de texto
"); 

#Ahora cerraremos el fichero 
fclose($Descriptor1); 

#Volvemos a abrirlo en modo w+ 
$Descriptor2 = fopen("nuevo_fichero.txt","a+"); 

#Escribimos un par de líneas 
fputs($Descriptor2,"Esta es la tercera línea de texto
"); 
fputs($Descriptor2,"Esta es la cuarta línea de texto
"); 

#Volvemos al principio del fichero 
rewind($Descriptor2); 

#Vamos leyendo líneas y mostrándolas 
while(!feof($Descriptor2)){ 

    $buffer = fgets($Descriptor2,4096); 
    echo $buffer."<BR>"; 

} 

#Cerramos el fichero 
fclose($Descriptor2); 

?>

El resultado de este método es el esperado. Se abre el fichero en modo escritura y se insertan las dos líneas de texto. Se cierra este descriptor, y se abre otro en modo a+. El cursor se sitúa al final del fichero, y comienza a añadir el texto. El resultado son las cuatro líneas dentro del fichero de texto.

Esto es todo en cuanto a modos de apertura. En la siguiente sección vamos a ver como subir ficheros al servidor, algo muy útil cuando se trata de páginas web.

Subir ficheros al servidor

Para ejemplificar la subida de archivos al servidor, vamos a ver un script de ejemplo. El script tiene dos partes; la primera, el formulario, en el que se introduce el fichero a cargar, y la segunda parte, en la que se procesa la subida y se informa al usuario del éxito o fracaso de la carga.

upload.php

<? 

if(!isset($cargar)){ 

?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML> 
<HEAD> 
<TITLE>:: Formulario de carga de ficheros ::</TITLE> 
</HEAD> 

<BODY> 

<FORM NAME="elForm" METHOD="POST" 
      ACTION="<? echo $PHP_SELF; ?>?cargar=1" 
      ENCTYPE="multipart/form-data"> 

    <TABLE WIDTH="80%" STYLE="font-family:Arial;font-size:9pt;"> 

    <TR> 
        <TD ALIGN="LEFT"><INPUT TYPE="FILE" NAME="elFichero"></INPUT></TD> 
    </TR> 

    <TR> 
        <TD ALIGN="LEFT"><INPUT TYPE="SUBMIT" VALUE="Subir el fichero"> 
    </TR> 

    </TABLE> 

</FORM></BODY></HTML> 

<? 

} 

#Aquí realizamos la carga del fichero 
if(isset($cargar)){ 

    #Le damos al fichero un nuevo nombre 
    $nuevositio = "nuevo_fichero_caragado.000"; 

    #Lo copiamos 
    if(!copy($elFichero,$nuevositio)){ 
        echo "NO SE HA PODIDO SUBIR EL FICHERO"; 
    } 
    else{ 
        echo "FICHERO SUBIDO CON ÉXITO"; 
    } 
     
} 

?>

Como vemos, el script realiza la carga del fichero. Para rizar un poco más el rizo os propongo lo siguiente: un script que suba un número de ficheros introducido por el usuario. Se compondrá de tres partes. La primera, en la que se pregunta al usuario el número de ficheros que desea introducir. La segunda, en la que aparecen todos los campos de tipo fichero, y la tercera, en la que se procesa la carga. El código es como sigue:

upload_multiple.php

<? 

/* Este script se encarga de subir múltiples ficheros al servidor. */ 

#Formulario en el que se pregunta el número de ficheros 
if(!isset($fich) && !isset($cargar)){ 

    $txt ="<HTML><HEAD>
"; 
    $txt.="<TITLE>:: ¿Cuántos ficheros quiere subir hoy? ::</TITLE>
"; 
    $txt.="</HEAD><BODY>
"; 
    $txt.="<FORM NAME="frmNumFicheros" 
                 METHOD="POST" 
                 ACTION="".$PHP_SELF."?fich=1">
"; 
     
    $txt.="<BR><BR><BR><BR>
"; 
    $txt.="<DIV ALIGN="CENTER">
"; 
    $txt.="<INPUT TYPE="TEXT" NAME="numFicheros">
"; 
    $txt.="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; 
    $txt.="<B>Introduce el número de ficheros</B>
"; 
    $txt.="<BR><BR>
"; 
    $txt.="<INPUT TYPE="SUBMIT" 
                  VALUE="Mostrar campos para subir ficheros">
"; 
    $txt.="<BR></DIV>
"; 

    $txt.="</FORM></BODY></HTML>
"; 

    echo $txt; 
} 

#Formulario en el que se muestran los campos tipo fichero 
if(isset($fich)){ 

    $txt ="<HTML><HEAD>
"; 
    $txt.="<TITLE>:: ¿Cuántos ficheros quiere subir hoy? ::</TITLE>
"; 
    $txt.="</HEAD><BODY>
"; 
    $txt.="<FORM ENCTYPE="multipart-form/data" 
                 NAME="frmCargaFicheros" 
                 METHOD="POST"
ACTION="".$PHP_SELF."?cargar=1&cantidad=".$HTTP_POST_VARS["numFicheros"]."">
"; 

    for($i=0;$i<$HTTP_POST_VARS["numFicheros"];$i++){ 
         
        $txt.="<INPUT TYPE="FILE" NAME="fichero_$i"><BR>
"; 

    } 

    $txt.="<INPUT TYPE="SUBMIT" VALUE="cargar">
"; 

    $txt.="</FORM></BODY></HTML>
"; 
     

    echo $txt; 
} 

#Parte que gestiona el proceso de carga 
if(isset($cargar)){ 

     
    for($n=0;$n<$cantidad;$n++){ 

        #Creamos la "variable variable" 
        $nomvar = "fichero_$n"; 
        $valvar = ${$nomvar}; 

        #Extraemos el nombre del fichero sin la ruta 
        $nomfichero = basename($valvar); 

        #Le damos al fichero su nombre, metiéndolo dentro del directorio /subidas 
        $nuevositio = "subidas/".$nomfichero.""; 

        #Lo copiamos 
        if(!copy($valvar,$nuevositio)){ 
            echo "NO SE HA PODIDO SUBIR EL FICHERO"; 
        } 
        else{ 
            echo "FICHERO SUBIDO CON ÉXITO"; 
        } 
    } 


} 

?>

De este modo podemos cargar varios ficheros al mismo tiempo. Tendrás que crear el directorio /subidas manualmente. Vamos a termnar con esta sección y pasar a la siguiente, en la que se explica como forzar al cliente a descargarse el fichero en vez de verlo on-line.

Forzar descarga de ficheros al navegador

A veces puede ser interesante que el usuario se descargue el fichero en vez de verlo on-line. Para realizar esta operación, solo necesitamos utilizar el siguiente código que voy a explicar a continuación. El script consta de una sola parte. Vamos a descargarnos un fichero .html, en vez de verlo en el navegador. El nombre del fichero será prueba_descarga.html. El código es como sigue:

descargar.php

<? 

function Descargar($ElFichero){ 

    $TheFile = basename($ElFichero); 
         
    header( "Content-Type: application/octet-stream");  
    header( "Content-Length: ".filesize($ElFichero));  
    header( "Content-Disposition: attachment; filename=".$TheFile."");  
    readfile($ElFichero);  
} 

Descargar("prueba_descarga.html"); 

?>

Como ves, el script se ejecuta y el fichero, pese a ser HTML, e interpretable por el navegador, es forzado a ser descargado, igual que si hubiéramos pulsado el botón derecho.

Y con esto termino este tutorial. Espero que os sea útil, aunque se que es corto. Es posible que en otro tutorial próximo me extienda más sobre este tema (sobre todo si mis conocimeintos aumentan, jeje).

Descargate los ficheros del artículo

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO