Como crear ficheros Zip con pclzip – Comprimir ficheros con pclzip en PHP

Aprenderemos a crear archivos comprimidos en ZIP para posteriormente almacenar en el servidor o para bajarlos al cliente. Esta serie puede ser interesante para aquellos que necesitan descargar múltiples archivos de una sola vez o para optimizar las descargas mediante archivos zip

Los archivos zip pueden sernos de ayuda a la hora de crear comprimidos para descargas del cliente o para realizar backups mediante php.
En este tutorial aprenderán a crear archivos comprimidos zip y ofrecerlos en descarga directa al cliente mediante la librería pclzip.

¿Qué es PCLZip?

PCLZip es una librería que nos ayuda a trabajar con archivos zip en php, ya sea comprimiendo o descomprimiendo archivos.
Nos será útil a la hora de ofrecer un servicio automático de backups de nuestro web o para la descarga de documentos generados mediante php.

Comprimir archivos en PHP

Sin muchos rodeos vamos a lo que nos interesa.
Lo primero es descargar la librería.
La situamos en nuestro directorio de trabajo y lo siguiente es incluir el archivo a nuestro script.

Con estos pasos ya tenemos integrada la librería para trabajar con ella.
Un código simple de compresión sería el siguiente:

require ("pclzip.lib.php");
$zipfile = new PclZip('archivo.zip');

Con estas dos líneas ya hemos creado el archivo zip en el directorio actual, el problema es que, obviamente no tiene contenido.

Así que vamos a meterle algún archivo dentro

require ("pclzip.lib.php");
$zipfile = new PclZip('archivo.zip');
$v_list = $zipfile->create('pclzip.lib.php');
if ($v_list == 0) {
   die ("Error: " . $zipfile->errorInfo(true));
}

En este caso hemos creado un archivo zip usando php con la misma clase que lo crea comprimida dentro.

La línea 3 se encarga de agregar el contenido y el if de comprobar errores.

Crear un archivo zip con PHP – Carpeta completa

Ahora ya sabemos crear un archivo zip con unos cuantos archivos dentro.
Pero que pasa si queremos introducir una carpeta completa?

La página oficial de pclzip utiliza este método:

    require_once('pclzip.lib.php');
   $archive = new PclZip('archive.zip');
   $v_dir = getcwd(); // or dirname(__FILE__);
   $v_remove = $v_dir;
   // To support windows and the C: root you need to add the 
   // following 3 lines, should be ignored on linux
   if (substr($v_dir, 1,1) == ':') {
     $v_remove = substr($v_dir, 2);
   }
   $v_list = $archive->create($v_dir, PCLZIP_OPT_REMOVE_PATH, $v_remove);
   if ($v_list == 0) {
     die("Error : ".$archive->errorInfo(true));
   }

Sin embargo yo lo veo “rizar el rizo” y se me ocurrió utilizar esta forma:

	require ("pclzip.lib.php");
	$zipfile = new PclZip('archivo.zip');
	$v_list = $zipfile->create('/backup_files/', 
			          PCLZIP_OPT_REMOVE_PATH, '/backup_files/');
	if ($v_list == 0) {
	die ("Error: " . $zipfile->errorInfo(true));
	}

El script crea un comprimido con todos los archivos dentro de la carpeta backup_files y luego elimina la carpeta del zip.
Cuando digo elimina me refiero a la carpeta, no al contenido de la misma..

Así que si nuestra carpeta contenía:

  • Archivo.txt
  • Archivo2.php
  • imagen.png

Al generar el archivo zip nos queda con esta estructura dentro:
backup_files/los archivos..

Sin embargo si en vez de pasarle por parámetro una sola carpeta y le pasamos /una_carpeta/otra/backup_files
Ésa es la estructura que nos queda.

Así que, con la constante PCLZIP_OPT_REMOVE_PATH nos encargamos de quitar esas carpetas molestas que al fin y al cabo solo contienen 4 miseros archivos.

Descargar el fichero zip

Para descargar el fichero solo tenemos que jugar con la función headers de php.

	header("Content-type: application/octet-stream");
	header("Content-disposition: attachment; filename="backup.zip");
	readfile('archivo.zip');

En este caso leemos el archivo generado (archivo.zip) y permitimos la descarga con el nombre backup.zip

Conclusión

Hemos aprendido a crear archivos zip, tanto archivos sueltos como carpetas enteras.
Hemos aprendido a servir los archivos comprimidos al usuario.

si la pregunta es: ¿Que me falta? la respuesta es sencilla, descomprimir archivos.
Por suerte para nosotros puede hacerse con la misma librería y en la página lo documentan.
Traeré la extracción de ficheros en unos días. ;)


Así nos han encontrado!

  • pclzip

2 Responses to Como crear ficheros Zip con pclzip – Comprimir ficheros con pclzip en PHP

  1. Como puedo crear un archivo comprimido y que este tenga una contraseña

  2. Donny dice:

    Gracias viejo, me sirvió de mucho tu post.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">