Generar Zip y Descargar con PHP

Con este script puede generar un archivo .zip usando PHP en la versión 8.

Generar ZIP

        const NOMBREPROYECTO  = 'nombreproyecto';
        $carpeta = 'nombrecarpeta';
        $zip = new ZipArchive();
        // Ruta absoluta
        $nombreArchivoZip = $carpeta . ".zip";
        $rutaDelDirectorio = '';

        if (!$zip->open($nombreArchivoZip, ZipArchive::CREATE | ZipArchive::OVERWRITE)) {
            $res = 'Error abriendo ZIP en ' . $nombreArchivoZip;
        } else {
            // Crear un iterador recursivo que tendrá un iterador recursivo del directorio
            $archivos = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($rutaDelDirectorio),
                RecursiveIteratorIterator::LEAVES_ONLY
            );

            foreach ($archivos as $archivo) {
                // No queremos agregar los directorios, pues los nombres
                // de estos se agregarán cuando se agreguen los archivos
                if ($archivo->isDir()) {
                    continue;
                }

                $rutaAbsoluta = $archivo->getRealPath();
                
                $nombreArchivo = substr($rutaAbsoluta, strlen($_SERVER["DOCUMENT_ROOT"] . '/' . NOMBREPROYECTO  . 'assets/uploads/'));
                $zip->addFile($rutaAbsoluta, $nombreArchivo);
            }
            // No olvides cerrar el archivo
            $resultado = $zip->close();
            if ($resultado) {
                $res = 'Carpeta comprimida' . $nombreArchivoZip;
            } else {
                $res = 'Error al crear zip';
            }
        }
        echo $res;

Descargar Zip

public function descargarZip($nombreArchivoZip)
    {
        header('Content-Type: application/octet-stream');
        header("Content-Transfer-Encoding: Binary");
        header("Content-disposition: attachment; filename=$nombreArchivoZip");
        // Leer el contenido binario del zip y enviarlo
        readfile($nombreArchivoZip);

        // Si quieres puedes eliminarlo después:
        unlink($nombreArchivoZip);
    }

Deja una respuesta