Crear un fichero ZIP con PHP

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.';
}

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.