Comprimir archivos dinámicamente en ZIP con PHP

Comprimir archivos dinámicamente en ZIP con PHP
En ocasiones es necesario comprimir dinámicamente uno o varios archivos para generar un único archivo que un usuario se pueda descargar en función de los parámetros de entrada. Algunos ejemplos en los que se puede usar:
  • Informes de algunos meses del año.
  • Múltiples imágenes o vídeos.
  • PDFs asociados a una página.
  • Etc.

Con PHP podemos comprimir en formato ZIP de varias maneras, pero vamos a destacar dos:

  • Nativamente con PHP, mediante su librería ZipArchive
  • Con librerías externas, como PclZip

Comprimiendo archivos en ZIP con PHP mediante ZipArchive

Si tu servidor tiene una versión superior a 5.2.0 y la extensión zip podemos hacer uso de ella.

Para saber si tenemos los requisitos, debemos usar la función phpinfo() en un archivo PHP y nos mostrará toda la información relativa al servidor.

Por ejemplo:

<?php

phpinfo();

?>

y debemos obtener una salida parecida a la siguiente:

Versión de PHP


Captura de pantalla de la versión de PHP para comprimir archivos en formato ZIP mediante PHP

ZIP activado
Comprimiendo archivos en PHP mediante ZIP

A continuación podemos usar la librería de la siguiente manera para comprimir los archivos a.txt y b.txt en el mismo archivo ZIP:


<?php

$zip = new ZipArchive();

$filename = 'test.zip';

if($zip->open($filename,ZIPARCHIVE::CREATE)===true) {
        $zip->addFile('a.txt');
        $zip->addFile('b.txt');
        $zip->close();
        echo 'Creado '.$filename;
}
else {
        echo 'Error creando '.$filename;
}

?>
teniendo especial cuidado en la ejecución para que tenga los permisos necesarios de escritura el archivo que comprime.

Comprimiendo archivos en ZIP con PHP mediante PclZip

En ocasiones no tenemos acceso a la instalación y modificación de paquetes y configuración de nuestro servidor, por lo que una buena opción es el uso de la librería PclZip.

Debemos descargar la librería y tras ello la guardaremos en una carpeta, por ejemplo lib.

<?php

require('lib/pclzip.lib.php');
$zip = new PclZip('test.zip');
$zip->create('a.txt,b.txt');

?>

Al igual que en el caso anterior, para crearlo deberemos tener permisos de ejecución.

Enlaces relacionados

Comentarios

Comentario de Bedder Alberto - 29 de Abril de 2012 - 21:17
Hola, que pasaria si en phpinfo(); te ponga: Directive - Local Value - Master Value zlib.output_compression - Off - Off Y queria saber si esto, guarda carpetas completas en ZIP O RAR?
Comentario de Imaginanet - Carlos - 30 de Abril de 2012 - 06:30
Hola Alberto, típicamente ZLIB se usa para comprimir páginas al vuelo, aunque como en es en este caso, contenido. Es una directiva que se puede cambiar desde el PHP.INI de tu PHP, por lo que te aconsejo que lo cambies. El formato de compresión es ZIP. Puedes encontrar más información en http://php.net/manual/en/zlib.configuration.php
Comentario de Juan Pablo Scheihing - 23 de Julio de 2012 - 16:43
Estimado, en esta guia, como comentaron antes, aparece utilizar el zlib, cuando en realidad se debe utilizar la libreria zip. La información se encuentra en el mismo sitio comentado anteriormente.
Comentario de Imaginanet - Carlos - 25 de Julio de 2012 - 06:16
Es cierto que la captura de pantalla no se corresponde con el ejemplo, ya está cambiado. Para un uso con zlib podemos verlo en la web de PHP http://www.php.net/manual/en/zlib.examples.php
Comentario de oscar - 28 de Junio de 2013 - 00:13
Donde queda el archivo que se crea?
Comentario de Reynaldo - 05 de Junio de 2014 - 19:32
Bien felicidades.... funciona!
Comentario de Lalo Elia - 06 de Agosto de 2014 - 15:40
Hola excelente tuto, necesito saber si el cliente puede descomprimir el directorio.zip y valla embebida la ruta absoluta para la descompresión, ej. C:directorio Desde ya muchas gracias.
Comentario de miguel - 08 de Septiembre de 2014 - 17:37
en el caso de usar el zip de PHP el archivo que llamadas en esta linea ya debe existir?? $filename = 'test.zip';
Comentario de Aurelio Vázquez Alejo - 09 de Diciembre de 2014 - 18:13
En nuestro caso tenemos diferentes tipos de rutas a descargar archivos y directorios, ya intentamos utilizar variables en lugar de valores estáticos, sin embargo los valores los omite, ¿como podemos realizar esta operación con variables?, de antemano muchas gracias por su ayuda. Saludos Cordiales
Comentario de Daemon - 06 de Julio de 2017 - 20:29
Muy bueno
Ha habido un error en el envío
Comentario enviado. Será revisado por la moderación antes de ser publicado.

Deja tu comentario

Tu nombre:
Tu email:
Tu comentario: