Introducción al trabajo con archivos ZIP en PHP
El archivado de datos es una de las tareas básicas del desarrollo web. Ya sea para la copia de seguridad de bases de datos, el empaquetado de archivos subidos por usuarios o la exportación de grandes volúmenes de información, el formato ZIP sigue siendo la solución más popular y versátil. PHP proporciona la clase integrada ZipArchive, que permite realizar todas las operaciones principales con archivos ZIP sin necesidad de instalar extensiones adicionales.
En este artículo, analizaremos en detalle cómo usar ZipArchive en PHP: desde la creación de un archivo simple hasta el manejo de carpetas anidadas y la protección con contraseña. Todos los ejemplos de código están listos para usar en su servidor.
Preparación: verificar la extensión Zip
Antes de comenzar, asegúrese de que la extensión zip esté habilitada en su servidor. Por lo general, está instalada por defecto en las versiones modernas de PHP (7.4+, 8.x). Puede verificarlo usando la función phpinfo() o un script simple:
<?phpif (extension_loaded('zip')) { echo 'La extensión Zip está disponible';} else { echo 'La extensión Zip no se encontró. Instálela a través de php.ini';}?>Creación de un archivo ZIP en PHP
Paso 1. Inicializar el objeto ZipArchive
Para comenzar, cree una instancia de la clase ZipArchive y abra un nuevo archivo usando el método open(). El segundo parámetro, la bandera ZipArchive::CREATE, indica que el archivo se creará de nuevo (o se sobrescribirá si ya existe).
<?php$zip = new ZipArchive();$zipName = 'example.zip';
if ($zip->open($zipName, ZipArchive::CREATE) !== TRUE) { exit("No se pudo crear el archivo $zipName");}?>Paso 2. Agregar archivos al archivo
El método addFile() agrega un archivo existente del sistema de archivos. El primer argumento es la ruta al archivo, el segundo (opcional) es el nombre del archivo dentro del archivo ZIP (si desea renombrarlo).
<?php// Agregar un solo archivo$zip->addFile('document.pdf', 'my_document.pdf');
// Agregar varios archivos$files = ['photo1.jpg', 'photo2.jpg', 'photo3.jpg'];foreach ($files as $file) { $zip->addFile($file);}?>Paso 3. Agregar una carpeta completa manteniendo la estructura
Si necesita empaquetar un directorio con todos los archivos anidados, use un recorrido recursivo. Aquí tiene una función lista:
<?phpfunction addFolderToZip($zip, $folder, $parentFolder = '') { $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($folder), RecursiveIteratorIterator::LEAVES_ONLY );
foreach ($files as $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = $parentFolder . $file->getFilename(); $zip->addFile($filePath, $relativePath); } }}
// Uso:$zip->addEmptyDir('my_folder'); // crear carpeta en el archivoaddFolderToZip($zip, '/path/to/source_folder', 'my_folder/');?>Paso 4. Cerrar el archivo
Después de agregar todos los archivos, asegúrese de cerrar el archivo; de lo contrario, los datos no se guardarán.
<?php$zip->close();echo "¡El archivo $zipName se creó exitosamente!";?>Descompresión de un archivo ZIP en PHP
Para extraer archivos, se utiliza 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) { $zip->extractTo('/path/to/extract_folder/'); $zip->close(); echo 'Archivo descomprimido exitosamente';} else { echo 'Error al abrir el archivo';}?>Funcionalidades avanzadas de ZipArchive
Agregar una cadena como archivo
El método addFromString() permite crear un archivo directamente desde una cadena