Leer y escribir Zip en PHP sin complicarse la vida
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:
-
require_once("pclzip.lib.php");
-
$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.
-
include_once("pclzip.lib.php");
-
-
$zip = new PclZip("test.zip");
-
-
if (($list = $zip->listContent()) == 0) {
-
}
-
-
for ($i=0; $i<sizeof($list); $i++) {
-
}
-
echo "<br>";
-
}
-
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:
-
include("pclzip.lib.php");
-
$archivo = new PclZip("archivo.zip");
-
-
if ($archivo->extract(PCLZIP_OPT_PATH, "data",
-
PCLZIP_OPT_REMOVE_PATH, "install/release") == 0) {
-
}
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.
-
include_once("pclzip.lib.php");
-
$archivo = new PclZip("archivo.zip");
-
-
$v_list = $archivo->create("data/file.txt,data/text.txt",
-
PCLZIP_OPT_REMOVE_PATH, "data",
-
PCLZIP_OPT_ADD_PATH, "install");
-
if ($v_list == 0) {
-
}
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:
-
require_once("pclzip.lib.php");
-
$archivo = new PclZip("archivo.zip");
-
-
$v_list = $archivo->add("file.txt,data/text.txt,folder/");
-
if ($v_list == 0) {
-
}
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.
Categorias: Aplicaciones, Código, HOWTO/CóMO, PHP |



Respeta el copyleft
noviembre
16:30 Sebastian Ha dicho:
Justo lo q buscaba, mil gracias.
noviembre
16:54 Alex Barros Ha dicho:
No hay de que!
diciembre
17:38 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.
diciembre
18:35 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.
julio
18:12 Master Linux Ha dicho:
Es un fiasco, cuando intenté comprimir backup de Postgresql genera el archivo vacio!
julio
19:48 Alex Barros Ha dicho:
Algo estarás haciendo mal. Intenta buscar cuál es el problema.
Mi experiencia personal es que funciona perfectamente.
agosto
19:30 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
agosto
8:47 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
octubre
2:20 Coral Ha dicho:
Hey! I like so much this documentation! it’s very useful, Thank you!
febrero
19:49 alberto Ha dicho:
Excelente ! Funciona de entrada sin tocar nada y muy simple de customizar.
Muchas Gracias
mayo
17:55 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???
septiembre
18:24 Yonny Ha dicho:
Hola.
Como hago par poder leer el contenido de un archivo que se encuentra dentro del zip
octubre
17:05 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.
marzo
17:36 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”);
?>
junio
19:53 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
junio
11:45 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
septiembre
23:57 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
septiembre
3:53 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.
junio
19:39 Alexis Ha dicho:
graxx!