ZIP es uno de los formatos de archivo más utilizados para comprimir datos. Cuando quieras que un usuario se descargue múltiples ficheros y carpetas de tu servidor, lo ideal es crear un fichero ZIP que comprima toda la información sobre la marcha. ¿Por qué? Te preguntarás... Muy sencillo, así haremos que la descarga sea mucho más rápida y no frustraremos al usuario.
Crear un fichero ZIP de un directorio es pan comido con PHP. La clase ZipArchiver de PHP nos permite comprimir ficheros y carpetas en un fichero ZIP. Puedes incluir el directorio de forma recursiva utilizando PHP. En este tutorial te mostraremos cómo crear un fichero ZIP a partir de un fichero utilizando PHP.
La clase ZipArchiver
La clase ZipArchiver nos ayuda a crear ficheros ZIP a partir de un directorio (ficheros y subdirectorios) del servidor.
-
ZipDir() Esta función crea un ZIP de un directorio de manera recursiva incluyendo el directorio padre. Sus parametros:
- $sourcePath Ruta relativa del directorio a comprimir
- $outZipPath Ruta del zip saliente
- dirToZip() - Es una función helper que añade ficheros y subdirectorios a nuestro fichero de compresión.
<?php Class ZipArchiver { /** * Zip a folder (including itself). * * Usage: * Folder path that should be zipped. * * @param $sourcePath string * Relative path of directory to be zipped. * * @param $outZipPath string * Path of output zip file. * */ public static function zipDir($sourcePath, $outZipPath){ $pathInfo = pathinfo($sourcePath); $parentPath = $pathInfo['dirname']; $dirName = $pathInfo['basename']; $z = new ZipArchive(); $z->open($outZipPath, ZipArchive::CREATE); $z->addEmptyDir($dirName); if($sourcePath == $dirName){ self::dirToZip($sourcePath, $z, 0); }else{ self::dirToZip($sourcePath, $z, strlen("$parentPath/")); } $z->close(); return true; } /** * Add files and sub-directories in a folder to zip file. * * @param $folder string * Folder path that should be zipped. * * @param $zipFile ZipArchive * Zip file where files end up. * * @param $exclusiveLength int * Number of text to be excluded from the file path. * */ private static function dirToZip($folder, &$zipFile, $exclusiveLength){ $handle = opendir($folder); while(FALSE !== $f = readdir($handle)){ // Check for local/parent path or zipping file itself and skip if($f != '.' && $f != '..' && $f != basename(__FILE__)){ $filePath = "$folder/$f"; // Remove prefix from file path before add to zip $localPath = substr($filePath, $exclusiveLength); if(is_file($filePath)){ $zipFile->addFile($filePath, $localPath); }elseif(is_dir($filePath)){ // Add sub-directory $zipFile->addEmptyDir($localPath); self::dirToZip($filePath, $zipFile, $exclusiveLength); } } } closedir($handle); } }
Crear ZIP en PHP
La clase ZipArchiver comprime todos los ficheros y subdirectorios de un directorio dado y devuelve un fichero ZIP.
Aquí tienes cómo utilizar la clase:
// Include and initialize ZipArchive class require_once 'ZipArchiver.class.php'; $zipper = new ZipArchiver; // Path of the directory to be zipped $dirPath = '/path/to/sourceDir'; // Path of output zip file $zipPath = '/path/to/archive-'.time().'.zip'; // Create zip archive $zip = $zipper->zipDir($dirPath, $zipPath); if($zip){ echo 'ZIP archive created successfully.'; }else{ echo 'Failed to create ZIP.'; }