Trabajo con archivos ZIP en PHP: guía completa sobre ZipArchive

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción al trabajo con archivos ZIP en PHP

La creación y manipulación de archivos ZIP es una de las tareas comunes en el desarrollo web. En PHP, esta tarea se resuelve con la extensión incorporada Zip, que proporciona la clase potente y conveniente ZipArchive. Con ella, puede crear nuevos archivos, descomprimir existentes, agregar o eliminar archivos, así como trabajar con metadatos.

En este artículo, analizaremos en detalle todas las operaciones principales con archivos ZIP en PHP: desde la creación simple hasta el manejo de errores y el trabajo con contraseñas. Todos los ejemplos están listos para usar en sus proyectos.



Preparación: verificar la disponibilidad de la extensión Zip

Antes de comenzar, asegúrese de que la extensión zip esté instalada y habilitada en su servidor. Puede verificarlo con la función phpinfo() o con un script simple:

<?phpif (extension_loaded('zip')) {    echo "La extensión Zip está disponible";} else {    echo "La extensión Zip no se encontró";}?>

Si la extensión no está presente, instálela a través del gestor de paquetes de su sistema operativo (por ejemplo, apt install php-zip para Ubuntu) o actívela en el archivo php.ini.



Creación de un nuevo archivo ZIP

La forma más sencilla de crear un archivo es abrir un nuevo archivo en modo de escritura y agregarle archivos. Veamos un ejemplo básico:

<?php$zip = new ZipArchive();$filename = 'example.zip';

// Creamos un nuevo archivo (ZIPARCHIVE::CREATE)if ($zip->open($filename, ZipArchive::CREATE) === TRUE) { // Agregamos un archivo del sistema de archivos local $zip->addFile('/path/to/file1.txt', 'file1.txt'); // Agregamos una cadena como un nuevo archivo en el archivo $zip->addFromString('hello.txt', '¡Hola, mundo!'); // Agregamos una carpeta completa (de forma recursiva) $zip->addGlob('/path/to/dir/*.*'); $zip->close(); echo "El archivo $filename se creó correctamente";} else { echo "Error al crear el archivo";}?>

Tenga en cuenta: el segundo parámetro de addFile() es el nombre del archivo dentro del archivo ZIP. Si no se especifica, el archivo se guardará con su nombre original.



Descompresión de un archivo ZIP

La extracción de archivos de un archivo ZIP se realiza con el método extractTo(). Especifique la carpeta de destino donde se descomprimirán los archivos:

<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) {    // Descomprimir todo en la carpeta 'unpacked'    $zip->extractTo('/path/to/unpacked/');    $zip->close();    echo "Archivo descomprimido";} else {    echo "Error al abrir el archivo";}?>

Si necesita extraer solo archivos específicos, pase su lista como tercer argumento:

$zip->extractTo('/path/to/unpacked/', ['file1.txt', 'hello.txt']);


Visualización del contenido del archivo

A veces es necesario obtener la lista de archivos dentro del archivo ZIP sin descomprimirlo. Para ello, use las propiedades y métodos de ZipArchive:

<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) {    echo "Número de archivos: " . $zip->numFiles . "<br>";        for ($i = 0; $i < $zip->numFiles; $i++) {        $stat = $zip->statIndex($i);        echo "Archivo: " . $stat['name'] . " (tamaño: " . $stat['size'] . " bytes)<br>";    }        $zip->close();}?>


Adición de archivos conservando la estructura de carpetas

Para conservar la jerarquía de directorios al agregar, use rutas relativas en el nombre del archivo dentro del ZIP:

<?php$zip = new ZipArchive();$zip->open('backup.zip', ZipArchive::CREATE);

// Agregamos un archivo conservando la subcarpeta$zip->addFile('/var/www/images/photo.jpg', 'images/photo.jpg');// O recursivamente toda la carpeta$zip->addPattern('/\\.(jpg|png)$/', '/var/www/images/', ['add_path' => 'images/']);

$zip->close();?>


Eliminación de archivos del archivo

Eliminar un archivo específico

Recommendations