coge la información y corre

Leer y escribir Zip en PHP sin complicarse la vida

2 de noviembre del 2007 Escrito por Alex Barros

Lo que hoy quiero mostraros es una genial librería, que facilita increíblemente el manejo de archivos zip con PHP; únicamente habrá que incluir un archivo a nuestro código, para gozar de toda su funcionalidad para abrir, explorar y crear archivos de tipo Zip.

Instanciación

El primer paso para usar esta librería es siempre el mismo, independientemente de lo que queramos hacer:

  1. require_once("pclzip.lib.php");
  2. $archivo = new PclZip("archivo.zip");

Como se observa, hemos incluido el fichero de la librería, y hemos instanciado la clase PclZip, con un nombre de archivo.
Este nombre de archivo puede ser uno existente, que queremos manipular, o uno inexistente, que queremos crear a continuación. Será más adelante cuando le indicamos lo que queremos hacer con archivo.zip (leer o escribir), hasta aquí únicamente lo hemos referenciado.


Lectura

En caso de que el archivo Zip sí exista, y queramos explorar su contenido, tenemos varias alternativas.

La primera es usar el método listContent(), el cual nos devuelve una lista de propiedades de los archivos y carpetas contenidos en el archivo zip.

  1. include_once("pclzip.lib.php");
  2.  
  3. $zip = new PclZip("test.zip");
  4.  
  5. if (($list = $zip->listContent()) == 0) {
  6.         die("Error : ".$zip->errorInfo(true));
  7. }
  8.  
  9. for ($i=0; $i<sizeof($list); $i++) {
  10.         for(reset($list[$i]); $key = key($list[$i]); next($list[$i])) {
  11.                 echo "Archivo $i / [$key] = ".$list[$i][$key]."<br>";
  12.         }
  13.         echo "<br>";
  14. }
  15.  

Lo cual nos devuelve algo como esto:

File 0 / [filename] = data/file1.txt
Archivo 0 / [stored_filename] = data/file1.txt
Archivo 0 / [size] = 53
Archivo 0 / [compressed_size] = 36
Archivo 0 / [mtime] = 1010440428
Archivo 0 / [comment] =
Archivo 0 / [folder] = 0
Archivo 0 / [index] = 0
Archivo 0 / [status] = ok

Archivo 1 / [filename] = data/file2.txt
Archivo 1 / [stored_filename] = data/file2.txt
Archivo 1 / [size] = 54
Archivo 1 / [compressed_size] = 53
Archivo 1 / [mtime] = 1011197724
Archivo 1 / [comment] =
Archivo 1 / [folder] = 0
Archivo 1 / [index] = 1
Archivo 1 / [status] = ok

Si nos interesa más extraer el contenido descomprimiendo archivos y carpetas, tendremos que usar el método extract(), el cual nos brinda muchas opciones. Veamos un ejemplo:

  1. include("pclzip.lib.php");
  2. $archivo = new PclZip("archivo.zip");
  3.  
  4. if ($archivo->extract(PCLZIP_OPT_PATH, "data",
  5. PCLZIP_OPT_REMOVE_PATH, "install/release") == 0) {
  6.         die("Error : ".$archivo->errorInfo(true));
  7. }

En este ejemplo todos los archivos se extraen en la carpeta “data”. Todos los archivos cuya ruta empiece por “install/release”, serán extraidos directamente en “data”, y no en “data/install/release”.

Existen muchas opciones con las que indicar exactamente lo que queremos que haga al extraer nuestros archivos. Puedes consultarlas en la documentación.

Escritura

Si tu intención es crear un archivo zip “al vuelo”, esta librería también va a yudarte, gracias al método create(), que creará un archivo zip con los archivos y carpetas que le indiquemos. Si le indicamos una carpeta, automáticamente incluirá todo el contenido en su interior. Además mantendrá la estructura de carpetas intacta dentro del archivo zip que creemos.

  1. include_once("pclzip.lib.php");
  2. $archivo = new PclZip("archivo.zip");
  3.  
  4. $v_list = $archivo->create("data/file.txt,data/text.txt",
  5.         PCLZIP_OPT_REMOVE_PATH, "data",
  6.         PCLZIP_OPT_ADD_PATH, "install");
  7. if ($v_list == 0) {
  8.         die("Error : ".$archivo->errorInfo(true));
  9. }

En el anterior código los archivos “file.txt” y “text.txt”, que se encuentran en la carpeta “data”, en el archivo zip creado se encontrarán en la carpeta “install”.

La librería nos permite manipular archivos zip con toda comodidad, usando los métodos add(), delete() o merge() , que añade archivos, elimina archivos, y fusiona archivos, respectivamente.

Ejemplo de añadir archivos:

  1. require_once("pclzip.lib.php");
  2. $archivo = new PclZip("archivo.zip");
  3.  
  4. $v_list = $archivo->add("file.txt,data/text.txt,folder/");
  5. if ($v_list == 0) {
  6.         die("Error : ".$archivo->errorInfo(true));
  7. }

Como podéis ver, se trata de una librería completa y funcional. Recomiendo su uso frente a otras alternativas.

Si quieres ver un ejemplo de su uso, puedes echar un vistazo al explorador de archivos zip que he incorporado en Codis.

Descargar pclzip-2-6.zip

Categorias: Aplicaciones, Código, HOWTO/CóMO, PHP |

A que no te atreves a escribir un comentario diciendo lo que piensas!

Hay 19 comentarios, pero nos falta el tuyo

Sebastian Ha dicho:

Justo lo q buscaba, mil gracias.

Alex Barros Ha dicho:

No hay de que!

Diego Ha dicho:

Hola Alex,

esta excelente tu nota sobre pclzip! he estado probando muchas cosas con esta utilidad y realmente esta increíble, aunque hay una cosa que no he logrado hacer, que es crear zips con archivos que se encuentran en otro directorio, p.e. tengo mi servidor apache en C://appserv/www/miweb/ pero mis archivos los tengo en D://archivos/para/zipear, pero me el siguiente error:

Error : PCLZIP_ERR_MISSING_FILE (-4) : File ‘/archivos/para/zipear/071213_archivo.wmv’ does not exists

el archivo existe, el nombre de archivo es correcto, lo único que he notado que en el error no me muestra la unidad que le he marcado en este caso la unidad D:, tienes alguna sugerencia al respecto?

saludos, Gracias.

Alex Barros Ha dicho:

Tal vez no esté preparado para los path de Windows, que son distintos a los de los sistemas UNIX (entorno idóndeo para PHP)

Realmente no puedo contestarte con certeza, ya que sólo doy a conocer la herramienta, desconozco por completo su funcionamiento interno.

Un saludo, y mucha suerte.

Master Linux Ha dicho:

Es un fiasco, cuando intenté comprimir backup de Postgresql genera el archivo vacio!

Alex Barros Ha dicho:

Algo estarás haciendo mal. Intenta buscar cuál es el problema.

Mi experiencia personal es que funciona perfectamente.

Freddy Mejia Ha dicho:

Estuve probando pclzip y funciona bien, pero a nivel de servidor me muestra la información del archivo, pero no descomprime. A que se debe esto? es algún bloqueo del proveedor?

Gracias de antemano

Alex Barros Ha dicho:

Estás usando las funciones adecuadas? o sea, el método extract?

Puede que el servidor no te esté permitiendo crear nuevos archivos en el directorio. Has probado a darle permisos especiales chmod a ese directorio?

Si crees que el servidor puede tener algo que ver, puedes preguntarles a ellos directamente.

Si encuentras cuál era el problema, te agradecería que lo comentaras, para que otras personas lo tengan presente. Gracias

Coral Ha dicho:

Hey! I like so much this documentation! it’s very useful, Thank you!

alberto Ha dicho:

Excelente ! Funciona de entrada sin tocar nada y muy simple de customizar.
Muchas Gracias

Eduardo Ha dicho:

Amigo como puedo hacer para que una vez creado el zip me aparezca la opcion en el browser para guardar el archivo???

Yonny Ha dicho:

Hola.
Como hago par poder leer el contenido de un archivo que se encuentra dentro del zip

Oraldo Ha dicho:

Yo uso el método extract para descomprimir un archivo de 36mg
y no me lo descomprime completamente solo me descomprime 18 mg a que se debe esto? miren el código que uso.

include(‘pclzip/pclzip.lib.php’);

//Funcion para extraer archivos.zip pasandole el destino
function Extraer($destino){

$archive = new PclZip(‘archivo.zip’);

if ($archive->extract($destino) == 0) {
die(“Error : “.$archive->errorInfo(true));
}
}

Necesito de su ayuda, gracias de antemano.

Peter Ha dicho:

– “Amigo como puedo hacer para que una vez creado el zip me aparezca la opcion en el browser para guardar el archivo??? ”

create($ListaArchivos) == 0) {
die(‘Error : ‘.$archivo_zip->errorInfo(true));
}

header(“Content-disposition: attachment; filename=Nombre_Fichero.zip”);
?>

Christopher Ha dicho:

Hola quisiera saber como puedo hacer para leer un archivo zip remoto, he probado

$mylink = “http://xxxxxxx/miarchivo.zip”;
$archivo = new PclZip($mylink);

y me arroja este error : ERROR : PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file http://xxxxxxx/miarchivo.zip.

para probar he utilizado tu link http://codis.boozox.net/zip
dandole la ruta de mi archivo y funciona correctamente…

me podrias guiar un poco con el tema?

saludos

Alex Barros Ha dicho:

@Christopher

Prueba importando primero el archivo a tu ordenador usando CURL, y una vez lo tengas en local extraer los archivos. Creo recordar que así es como yo lo hice.

Un saludo

Rafausoc Ha dicho:

Alex Barrox: Mil gracias por este aporte, despues de dos años de buscar y buscar esta era la solucion.

Mil gracias de nuevo

Alex Barros Ha dicho:

Un auténtico placer. Cualquier otra cosa que necesites, seguro que está en este blog, y sino puedes preguntar lo que quieras.

Un saludo.

Alexis Ha dicho:

graxx!

del.icio.us meneame.net RSS

Search:

Bicivalencia Localiza las estaciones de Valenbisi, servicio público de bicicletas en Valencia, España. Ver más Gpsia Descubre y comparte rutas por todo el mundo, tomadas con GPS. Ver más Imaset Edita tus imágenes de Wordpress con este sencillo plugin. Ver más

¡Mi música es tuya!

Digo yo que...

Mis fotos de Flickr

Entradas recientes

Meta:

Respeta el copyleft

,