Crear archivos ZIP con PHP

  • 31/10/2007
  • 10:01 am
  • unijimpe

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.

PHP:
  1. require ("zipfile.php");
  2. $zipfile = new zipfile();
  3. $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:

PHP:
  1. require ("zipfile.php");
  2. $zipfile = new zipfile();
  3. $zipfile->add_file(implode("",file("img01.jpg")), "foto.jpg");
  4.  
  5. header("Content-type: application/octet-stream");
  6. header("Content-disposition: attachment; filename=zipfile.zip");
  7. 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:

PHP:
  1. require ("zipfile.php");
  2. $zipfile = new zipfile();
  3. $zipfile->add_dir("img/");
  4. $zipfile->add_file(implode("",file("img01.jpg")), "img/01.jpg");
  5. $zipfile->add_file(implode("",file("img02.jpg")), "img/02.jpg");
  6. $zipfile->add_file(implode("",file("img03.jpg")), "img/03.jpg");
  7.  
  8. header("Content-type: application/octet-stream");
  9. header("Content-disposition: attachment; filename=fotos.zip");
  10. 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.

Posts Relacionados

Total de Comentarios: 13

Publicidad
PReTo
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
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!

01/11/2007
12:06 am

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

marcelo
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.

24/11/2007
9:07 pm

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

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
06/12/2007
2:21 pm

Por fin algo que si funciona. Gracias

carlos Sanitillán
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
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
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
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
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
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

Enviar Comentario

(*)

(*)