Crear archivos ZIP con PHP

En esta ocasión veremos la forma de crear archivos comprimidos en formato ZIP. Para este ejemplo utilizaremos la clase zipfile escrita por Eric Mueller y muy bien explicada en Creating ZIP files with PHP.

Descargando la clase zipfile

Lo primero es descargar la clase zipfile desde zipfile.inc.txt y renombrarla a zipfile.php. Esta clase tiene dos metodos add_dir() y add_file() que permite agregar una carpeta o un archivo al zip que se esta creando.

Creando nuestro primer ZIP

Lo primero es incluir el archivo recién descargado, luego de ello creamos una instancia de la clase, para este ejemplo a la instancia lo llamamos $zipfile. Luego de ello agregamos un archivo de la siguiente forma.

require ("zipfile.php");
$zipfile = new zipfile();
$zipfile->add_file(implode("",file("img01.jpg")), "foto.jpg");

Nótese que estamos agregando un archivo llamado img01.jpg y al momento de incluirlo en el zip lo estamos renombrando a foto.jpg. Hasta este punto hemos creado un archivo zip, el siguiente paso es enviarlo al cliente, para ello agregamos headers indicando el tipo de archivo y finalmente imprimimos el archivo:

require ("zipfile.php");
$zipfile = new zipfile();
$zipfile->add_file(implode("",file("img01.jpg")), "foto.jpg");

header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=zipfile.zip");
echo $zipfile->file();

El resultado del ejemplo lo pueden ver en http://samples.unijimpe.net/php-zip/.

Agregando carpetas al ZIP
En el caso que agregamos varios archivos y deseamos agruparlas en una carpeta, podemos utilizar el metodo add_folder. Luego de ello agregamos los archivos a la carpeta de la siguiente forma:

require ("zipfile.php");
$zipfile = new zipfile();
$zipfile->add_dir("img/");
$zipfile->add_file(implode("",file("img01.jpg")), "img/01.jpg");
$zipfile->add_file(implode("",file("img02.jpg")), "img/02.jpg");
$zipfile->add_file(implode("",file("img03.jpg")), "img/03.jpg");

header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=fotos.zip");
echo $zipfile->file();

Como ven agregar carpetas y multiples archivos es muy sencillo, incluso se pueden renombrar los archivos al momento de agregarlos al archivo zip. El resultado de este ejemplo lo pueden ver en: http://samples.unijimpe.net/php-zip/zipfolder.php.

Finalmente les dejo los archivos fuentes de este post, para que lo puedan utilizar y modificar de acuerdo a sus necesidades.

Comentarios Total 39 comentarios

PReTo
Publicado: 31/10/2007 3:44 pm

MUY BUENO!! Estaba buscando algo por el estilo hace mucho tiempo.
Gran blog. Vovlere todos los dias.

Salu2!

PReTo
Publicado: 31/10/2007 4:24 pm

Ahora me surge una pregunta. Hay alguna forma de partir el archivo en 3 partes por ejemplo? Donde puedo sacar mas info sobre esta clase?

Gracias!

Crear archivos zip con PHP | ChristianGL.CoM
Publicado: 01/11/2007 12:06 am

[…] Leído en Unijimpe. […]

marcelo
Publicado: 01/11/2007 9:32 pm

la verdad que la web esta fascinante, tenes unos tutoriales espectaculares y me gustaría saber si tenes alguna dirección o web o lugar donde pueda iniciar php desde cero, a aprender y progresar para llegar a algo parecido de lo sabes vos. desde ya gracias.
saludos.

Firewall
Publicado: 24/11/2007 9:07 pm

Oye man disculpa solo se pueden crear zip o tambien otros como gzip o tar?

TaLu
Publicado: 26/11/2007 9:26 pm

Muy buena clase, resulta muy útil para descargar por ejemplo carpetas o archivos .sql previamente respaldados desde un script.

De momento estoy utilizando esta clase para respaldar el mysql: http://www.phpclasses.org/browse/package/2779.html

Que en combinación con esta queda perfecta ;)

Gracias.

Juan Carlos MC
Publicado: 06/12/2007 2:21 pm

Por fin algo que si funciona. Gracias

carlos Sanitillán
Publicado: 06/12/2007 3:29 pm

es exelente tu, código, hace tiempo que buscaba ejemplos, pero tu ya lo tienes hecho gracias, por compartir tu conocimiento, con los demas….att.

lisandro
Publicado: 01/01/2008 6:00 am

Hola!! La verdad se ve muy bueno pero descargé la librería, probé el ejemplo y NO funciona. Error:
Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\etapa2\zipfile.php:1) in C:\xampp\htdocs\etapa2\downZip.php on line 9

Debe haber algun echo o algo que impide mostrar la ventana de descarga….

naaas
Publicado: 08/05/2008 8:16 am

Muy bueno tu artículo. Tengo problemas con los acentos tanto en carpetas como en ficheros. Existe alguna documentación al respecto?

Gracias.

frandy
Publicado: 22/08/2008 11:02 am

y si no quiero descargar el archivo, sólo crearlo en un directorio, cómo lo haría?

juanma
Publicado: 11/09/2008 6:47 am

Este error:»Cannot modify header information» esto puede ser porque te has dejado espacio en blanco al final del archivo zipfile.php

Antonio Balam
Publicado: 17/09/2008 2:39 pm

Excelentisimo tutorial, de eso se trata, de no hacer tan engorroso ni tanto tecnicismo…

Felicidades, no he podido revisar bien su website pero si es como este tutorial entonces creo que lo visitare frecuentemente

sigan asi y mucho exito

rockobop
Publicado: 31/10/2008 8:41 am

puedo crear archivos zip en el lado del cliente ???? para despues subir este archivo al servidor ???

saludos

Omar
Publicado: 18/11/2008 11:53 am

Hay un problema con esta clase, todo funciona muy bien, crea los archivos en windows, etc. Peeeero, marca un error cuando usas la herramienta de zips que trae windows por default.
El error es el siguiente: The Compressed (zipped) Forder is invalid or corrupted.
Al parecer, otra vez windows se sale del estandar, esto es un problema cuando tus clientes lo usan por default.
Este issue no se presenta con winrar.

Jeans
Publicado: 18/12/2008 11:12 am

Bueno esta muy buena la clase para zipear archivos en php, la cual me funciona muy bien en 2 distintos servidores, pero en el tercer servidor no me funciona muy bien que digamos cuando descarga me sale este error:
Archive: /home/jeans/Escritorio/zipfile(2).zip 1924588 bytes 3 files
warning [/home/jeans/Escritorio/zipfile(2).zip]: 611133 extra bytes at beginning or within zipfile
(attempting to process anyway)
error [/home/jeans/Escritorio/zipfile(2).zip]: start of central directory not found;
zipfile corrupt.
(please check that you have transferred or created the zipfile in the
appropriate BINARY mode and that you have compiled UnZip properly)

Me podrias decir a que se debe, o si tengo que instalar alguna extencion de php, o libreria bueno no se favor de responder cuanto antes muchas gracias..

edward
Publicado: 20/01/2009 1:36 pm

Quisiera saber si al zipfile que se genera se le puede cambiar el nombre para que diga por ejemplo en wordpress.zip

Rafael Miranda
Publicado: 23/02/2009 2:58 pm

Buen tutorial, me sirvió mucho para mi web, pero desgraciadamente me arroja un error (en Mac) al descomprimir con la aplicación predeterminada de OSX (Bom archiver, creo que se llama).

En PHPMyAdmin hay una versión modificada que no genera este error y funciona muy bien (buscar el archivo zip.lib.php), aunque no sabría decir qué modificaron.

Gracias por la info :)

Gilberto Ramos
Publicado: 18/03/2009 3:51 pm

He combinado la función para generar backups en MySQL ( http://www.phpclasses.org/browse/package/2779.html ) con este script solo que me parece que es mas completo si le agregan la funcion OUTPUT en la clase… miren esto..
http://snipplr.com/view.php?codeview&id=3691

rauls
Publicado: 13/06/2009 1:50 am

hola como estan encontre este post por google, ya tiene algo que lo postearon, pero tengo una duda.

¿SE LE PUEDE PONER CLAVE AL ZIP AL MOMENTO DE CREARLO CON ESTA RUTINA?

gracias

MAJESTIC12
Publicado: 06/11/2009 5:16 am

y como puedo enviar el resultado por mail??

gracias

Pablo
Publicado: 22/02/2010 5:56 am

No pensaba que fuese tan fácil, le he dado muchas vueltas pero al final funcionaba solo. Gracias.

Patricia
Publicado: 10/06/2010 9:27 am

Hola! excelente post, pero el problema que tengo que tengo los archivos en una base de datos… como puedo obtener los archivos desde la base y comprimirlos?

Gracias! :D

javier
Publicado: 26/08/2010 9:40 pm

yo tambien tengo el mismo problema que Patricia; alguien que nos pueda ayudar???

Saludos!!!

julian
Publicado: 17/09/2010 6:43 pm

Todo funciona bien hasta que crea el zip, pero revisando los archivos todos estan a 0bytes, osea, no tengo archivos, que puedo hacer?

Joel
Publicado: 14/10/2010 8:09 pm

alguien sabe cual es el límite de tamaño de un archivo para comprimir? porque al parecer me provoca error al comprimir un archivo y sospecho que es por el tamaño

Carlos Santiago Novoa Farkas
Publicado: 26/10/2010 9:31 am

Bueno, antes que nada, mil gracias por el aporte !!!
Me salvaste la vida…
Hace varias semanas que vengo intentando realizar esto que muestras de forma tan sencilla… El ejemplo funcionó sin problemas.

Realizar archivos .rar es casi imposible…

Bueno, muchas gracias nuevamente por el aporte !

Saludos !

larno
Publicado: 24/11/2010 3:37 pm

exelente, muy bueno es super-necesario en mi web
mil gracias por el aporte!!

Fran
Publicado: 12/03/2011 11:44 am

Si compilas los archivos con este pack, y lo intentas abrir en MAC (Leopard OS X) devuelve Operación no permitida (-1). Incluso el demo me tira el error que comento, jeje.

Una pena, andaba buscando algo asi. Aunque me parece genial.

Un saludo!

Mano
Publicado: 25/06/2011 3:10 am

Funciona de maravilla, lo unico malo es que los archivos que residen dentro del zip pesan 0 bytes y no se pueden visualizar.

Mano
Publicado: 25/06/2011 5:26 pm

ah ya consegui que funcionase. Solo hay que leer los contenidos de la carpeta donde se encuentran los archivos que pondremos dentro del zip y hacer un while loop para coger los archivos, hacemos un if statement para ver que el archivo no sea directorio y un strpos > 0 para checar que sea .jpg (en caso de imagenes); luego creamos nuestro directorio zippeado asi como sus archivos, esto dentro del mismo loop, ya despues cerramos el curly bracket del if, llamamos las cabeceras para forzar la descarga, hacemos el echo y cerramos el curly bracket del while loop y enseguida nuestro directorio original. Espero haberme explicado bien.

eric
Publicado: 30/06/2011 6:08 am

al momento de la descarga en lugar de descargarse los archivos los imprime en pantalla…. nose si es por el servidor u otra cosa

Humberto Tina
Publicado: 31/01/2012 11:25 am

Hola, tengo un problema con este script, tengo que empaquetar fotos, el numero de archivos es variable, pero si supera las 200 fotos, el zip se crea pero vacio, como puedo solucionarlo y poder empaquetar mas de 200 fotos.
Gracias

Danika
Publicado: 11/02/2012 11:24 am

Awwww muchas gracias, funciona a la perfección (Y) <3

MisterHCH
Publicado: 27/02/2012 7:33 am

El problema es que si en la misma página tienes información en pantalla y vas a descargar los archivos no puedes en la misma página hacer los Content—-, porque te abre una para la descargar y luego tienes que actualizar la página tu mismo para ajustar el resultado.

Diseño web y posicionamiento seo en colombia
Publicado: 21/04/2012 10:50 pm

Gracias por la información, es muy valiosa para lo que nos interesa y apasiona el diseño web, muy buen artículo

Bedder Alberto
Publicado: 29/04/2012 4:39 pm

Hola, quisiera saber si hay algún código que en liste toda las carpetas y las comprima en un zip o rar

en vez de estar e listando manualmente todo los archivos y carpetas:

$zipfile->add_dir(«img/»);
$zipfile->add_file(implode(«»,file(«img01.jpg»)), «img/img1.jpg»);
$zipfile->add_file(implode(«»,file(«img02.jpg»)), «img/img2.jpg»);
$zipfile->add_file(implode(«»,file(«img03.jpg»)), «img/img3.jpg»);

Eigiem
Publicado: 30/05/2012 9:38 am

Muchas gracias por esta información, por subirlo a box y por este blog tan bueno y fácil de leer

posicionamiento web en panama
Publicado: 21/05/2014 8:48 am

Excelente éste recurso sumamente útil para hacer respaldo de nuestras imágenes por ejemplo para luego comprimirlas, se les agradece. Saludos

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)