informaticaPC

Tutorial de PHP

Comprimir y descomprimir archivos, subir archivos al servidor web (upload de archivos)...


Regístrate

Tus datos no serán compartidos, solo nosotros te enviaremos información y novedades

Borrar líneas en un archivo de texto

Para borrar líneas en un archivo de texto es necesario leer el archivo, eliminar las líneas deseadas y volverlo a escribir. Una forma de hacerlo es usando las función file(), que carga cada línea de texto en un array, junto con array_splice() que nos permite eliminar posiciones de un array.

<?php
    // Obtener cada línea en un array:
    $aLineas = file("datos.txt");
    print_r($aLineas);

    echo "<p>CONTENIDO DEL ARCHIVO</p>";
    echo "<p>=====================</p>";

    // Mostrar el contenido del archivo:
    foreach( $aLineas as $linea )
        echo $linea."<br/ >";

    echo "<p>Borrando la tercera línea...</p>";

    // Borrar el tercer elemento del array (la tercera línea):
    array_splice($aLineas, 2, 1);
    print_r($aLineas);

    // Abrir el archivo:
    $archivo = fopen("datos.txt", "w+b");

    // Guardar los cambios en el archivo:
    foreach( $aLineas as $linea )
        fwrite($archivo, $linea);

    echo "<p>CONTENIDO DEL ARCHIVO</p>";
    echo "<p>=====================</p>";

    // Mostrar el contenido del archivo:
    foreach( $aLineas as $linea )
        echo $linea."<br/ >";

    fclose($archivo);
?>

Descargar ejemplo

Información

Es recomendable comprobar si las operaciones realizadas con las funciones de archivos explicadas se han realizado correctamente (mediante los valores que devuelven en caso de error).

Leer un archivo y enviarlo al navegador web

Con la función de PHP readfile() podemos leer un archivo enviando el resultado al buffer de salida (el navegador web).

Por ejemplo si tenemos un archivo de página web con código HTML podemos usar readfile() para leerlo y enviarlo al navegador web del usuario, en el que será visualizada normalmente la página web.

test.html:

<html>
    <head>
        <title>Ejemplo de readfile() | informaticapc.com</title>
    </head>

    <body>
        Ejemplo de readfile();
    </body>
</html>

04_archivos_enviar_1.php:

<?php
    $archivo = "test.html";

    if( file_exists($archivo) )
    {
        header("Content-type: text/html");
        header("Content-length: ".filesize($archivo));

        readfile($archivo);
    }
?>

Descargar ejemplo

También podemos usar readfile() junto la función header() para enviar un archivo de modo que pueda ser descargado por el usuario:

<?php
    $archivo = "test.pdf";

    if( file_exists($archivo) )
    {
        // Enviamos el PDF al cliente
        header("Content-type: application/pdf");
        header("Content-Disposition: attachment; filename=".$archivo);
        header("Content-length: ".filesize($archivo));

        readfile($archivo);
    }
?>

Descargar ejemplo

Al ejecutar el archivo PHP veremos el siguiente cuadro de diálogo:

Enviar archivo

Más información

Vea también: [ MIME Types ] - [ header() ] - [ readfile() ] - [ mime_content_type() ]

Copiar, renombrar, mover y eliminar archivos

Para copiar y eliminar archivos disponemos de las funciones copy() y unlink(), respectivamente.

Hay que tener en cuenta que al copiar un archivo a otro directorio, si existe uno con el mismo nombre será sobreescrito.

Si lo que necesitamos es renombrar o mover archivos, en ambos casos utilizaremos la función rename().

Todas estas funciones devuelven true o false si ha ocurrido algún error.

<?php
    // Copiar el archivo a otra ruta;
    copy("datos.txt", "c:\\datos.txt");

    // Copiar el archivo con otro nombre:
    copy("datos.txt", "datos-2.txt");
    copy("datos.txt", "datos-3.txt");
    copy("datos.txt", "datos-4.txt");

    // Renombrar el archivo:
    rename("datos-2.txt", "datos---2.txt");

    // Renombrar carpetas:
    rename("miCarpeta1", "miCarpeta1-1");
    rename("./miCarpeta2", "./miCarpeta2-2");

    // Mover el archivo:
    rename("datos-3.txt", "c:\\datos-3-3.txt");

    // Eliminar el archivo:
    unlink("datos-4.txt");

    echo "Proceso finalizado";
?>

Descargar ejemplo

Información

Es recomendable comprobar si las operaciones realizadas con las funciones de archivos explicadas se han realizado correctamente (mediante los valores que devuelven en caso de error).

Más información

Vea también: [ copy() ] - [ rename() ] - [ unlink() ]

Subir archivos al servidor (upload)

Para hacer upload (subir archivos al servidor web en primer lugar debemos crear un formulario HTML con los atributos method="post" y enctype="multipart/form-data", y que contenga un componente de tipo <input type="file" ... />.

Tras seleccionar un archivo y enviarse el formulario, la información del archivo subido quedará guardada en el array asociativo $_FILES, que tiene las siguientes claves:

  • name: nombre original del archivo.
  • tmp_name: nombre temporal del archivo subido junto con la ruta temporal (los archivos subidos se guardan en un directorio temporal).
  • type: tipo de archivo.
  • error: código de error, si sucedió alguno.
  • size: tamaño del archivo en bytes.

Para acceder al archivo subido utilizaremos las funciones de PHP is_uploaded_file() (para comprobar si el archivo fue subido al directorio temporal usando el método POST) y move_uploaded_file() (mueve el archivo temporal hacia la ruta actual).

09_archivos_upload.html:

<html>

    <head>
        <title>Enviar E-Mail desde PHP | informaticapc.com</title>
    </head>

    <body>
        <form name="frmUpload" action="09_archivos_upload.php" method="post" enctype="multipart/form-data">

            Archivo: <input type="file" name="txtFile" id="txtFile" />
            <input type="submit" name="btnSubmit" value="Enviar" />

        </form>
    </body>

</html>

09_archivos_upload.php:

<?php
    if( empty($_FILES['txtFile']['name']) == false )
    {
        if (is_uploaded_file($_FILES['txtFile']['tmp_name']))
        {
            if( move_uploaded_file($_FILES['txtFile']['tmp_name'], $_FILES['txtFile']['name']) == false )
                echo "No se ha podido el mover el archivo.";
            else
                echo "Archivo [".$_FILES['txtFile']['name']."] subido y movido al directorio actual.";
        }
        else
        {
           echo "Posible ataque al subir el archivo [".$_FILES['txtFile']['nombre_tmp']."]";
        }
    }
    else
    {
        echo "No se seleccionó ningún archivo.";
    }
?>

Descargar ejemplo

Información

IMPORTANTE: hay que tener en cuenta que si no se selecciona ningún archivo, el array $_POST contendrá un elemento con un valor en la clave error de '4': dicho código informa de que no se subió ningún archivo.

Para ver otros códigos de error comprueba el enlace facilitado a continuación.

Más información

Vea también: [ $_FILES ] - [ is_uploaded_file() ] - [ move_uploaded_file() ]

Comprimir y descomprimir

Desde PHP podremos comprimir y descomprimir archivos y carpetas de forma muy sencilla, pudiendo hacerlo en los principales formatos de compresión de archivos: gz, rar, zip, etc.

En el siguiente ejemplo puedes ver cómo crear un archivo comprimido en formato ZIP utilizando la Clase ZipArchive:

<?php
    $archivo_origen1 = "logo.jpg";
    $archivo_origen2 = "archivo.html";
    $archivo_zip = "comprimido.zip";

    // Creamos una instancia de la clase ZipArchive:
    $zip = new ZipArchive();

    // Creamos el archivo zip:
    if ($zip->open($archivo_zip, ZIPARCHIVE::CREATE) === true )
    {
        // Añadimos archivos:
        $zip->addFile( $archivo_origen1 );
        $zip->addFile( $archivo_origen2 );

        // Cerramos el archivo zip:
        $zip->close();

        echo "Proceso finalizado";
    }
    else
    {
       echo "Ha ocurrido un error";
    }
?>

Descargar ejemplo

Para descomprimir todos los archivos usaremos el método extractTo() (si la carpeta en la que se desea extraer los archivos no existe será creada):

<?php
    $archivo_zip = "comprimido.zip";

    // Creamos una instancia de la clase ZipArchive:
    $zip = new ZipArchive();

    // Abrimos el archivo zip:
    if( $zip->open($archivo_zip) === true )
    {
        $zip->extractTo('./temp/');
        $zip->close();

        echo 'Archivo descomprimido';
    }
    else
    {
        echo 'Error al descomprimir';
    }
?>

Descargar ejemplo

Si quisiéramos extraer sólo determinados archivos, como segundo parámetro pasaríamos un array con sus respectivos nombres y extensiones.

Consulta el enlace sobre ZipArchive para ver los demás métodos disponibles.

Información

Para usar esta clase en PHP bajo Windows hay que descomentar la extensión php_zip.dll, mientras que en distribuciones basadas en Linux es preciso instalar la librería ZZIPlib y compilar PHP utilizando la directiva --with-zip[=DIR] (en '[DIR]' se indica el directorio de instalación de ZZIPlib).

Más información

Vea también: [ ZipArchive::extractTo() ]

Crear, renombrar, eliminar y cambiar de directorio

La función de PHP getcwd() nos devuelve el directorio actual, y con chdir() podremos cambiar a otro.

Para crear un directorio usaremos la función mkdir(), indicando como primer parámetro su nombre y como segundo parámetro (opcional) los permisos que deberá tener (sólo en sistemas UNIX, no es aplicable en Windows).

Asimismo, podremos también crear directorios de forma recursiva asignando el valor true como tercer parámetro.

Si deseamos eliminar un directorio vacío cuyos permisos lo permitan, usaremos la función rmdir() (no los borra de forma recursiva).

<?php
    // Obtener el directorio actual:
    echo "El directorio actual es: [".getcwd()."]<br />";

    // Cambiar el directorio actual:
    chdir("c:\\");

    // Obtener el directorio actual:
    echo "Ahora el directorio actual es: [".getcwd()."]<br />";

    // Crear directorios:
    mkdir("miCarpeta58975-01-1");
    mkdir("./miCarpeta58975-02-1");
    mkdir("./miCarpeta58975-03-1/miCarpeta58975-03-2/miCarpeta589752-03-3/", null, true);

    // Renombrar directorio
    rename("miCarpeta58975-01-1", "miCarpeta58975--01--1");

    // Borrar un directorio (no borra los subdirectorios):
    rmdir("./miCarpeta58975-02-1");
?>

Descargar ejemplo

Otra función útil es is_dir(), que nos informará de si el nombre pasado como parámetro corresponde a un directorio.

Información

Es recomendable comprobar si las operaciones realizadas con las funciones de archivos explicadas se han realizado correctamente (mediante los valores que devuelven en caso de error).

Más información

Vea también: [ getcwd() ] - [ chdir() ] - [ mkdir() ] - [ rmdir() ] - [ rename() ]

Listar el contenido de un directorio

En caso de necesitar obtener el contenido de un directorio disponemos de la función glob() que nos devolverá el contenido según el patrón especificado.

También nos serán muy útiles opendir() que nos devolverá un recurso con el que podremos gestionar el contenido del directorio y readdir(), que devuelve el nombre del siguiente archivo leído desde el recurso obtenido con opendir().

IMPORTANTE: readdir() devuelve false en caso de error, pero también puede devolver cero o cadena vacía que serían evaluados como tal: al realizar la comparación utiliza los operadores === o !==, que tienen en cuenta también si los valores son del mismo tipo de datos.

<?php
    // Cambiar el directorio actual:
    chdir("c:\\");

    // Mostrar el contenido del directorio actual:
    foreach( glob("*.*") as $archivo )
        echo $archivo."<br />";

    echo "<p>-------------------------</p>";

    // Otra forma de obtener el contenido del directorio:

    // Obtenemos el contenido del directorio (se usa  doble barra inversa, en Windows):
    $aArchivos = opendir("c:\\windows");

    while( ($archivo = readdir($aArchivos)) !== false ) {
        echo $archivo."<br/>";
    }

    echo "<p>-------------------------</p>";
    echo "<p>Finalizado</p>";
?>

Descargar ejemplo

Más información

Vea también: [ glob() ] - [ opendir() ] - [ readdir() ]

Otras funciones útiles sobre directorios

Otras funciones útiles para el manejo de directorios son:

  • dirname(): devuelve el directorio padre de la ruta pasada como parámetro.
  • is_dir(): indica si el nombre pasado como parámetro es un directorio.
  • pathinfo(): devuelve información sobre una ruta de archivo.
Más información

Vea también: [ dirname() ] - [ is_dir() ] - [ pathinfo() ]

Primera página Anterior Siguiente Última página
Usamos cookies para ofrecerte una experiencia mejorada, el continuar navegando supone que aceptas su uso