Lenguaje PHP

Crear Zip usando PHP: Ejemplo completo

Comprimir archivos ZIP con PHP

Crear Zip usando PHP. Este es un complemento de Como crear un archivo zip desde PHP donde agregábamos archivo por archivo al zip, en cambio la forma que les voy a presentar a continuación se puede comprimir un directorio entero incluyendo subdirectorios y archivos dentro de directorios. En este ejemplo también estamos utilizando ZipArchive.

Este es el código junto con los respectivos comentarios:

Crear Zip usando PHP Ejemplo completo
Crear Zip usando PHP Ejemplo completo

Crear Zip usando PHP

Usaremos la clase ZipArchive() de PHP. Por lo tanto, nos es necesario crear la clase porque es nativo del PHP para poder comprimir ficheros en extensión ZIP.

function agregar_zip($dir, $zip) {
//verificamos si $dir es un directorio
if (is_dir($dir)) {
//abrimos el directorio y lo asignamos a $da
if ($da = opendir($dir)) {
//leemos del directorio hasta que termine
while (($archivo = readdir($da)) !== false) {
/*Si es un directorio imprimimos la ruta
* y llamamos recursivamente esta función
* para que verifique dentro del nuevo directorio
* por mas directorios o archivos
*/
if (is_dir($dir . $archivo) && $archivo != "." && $archivo != "..") {
echo "<strong>Creando directorio: $dir$archivo</strong><br/>";
agregar_zip($dir . $archivo . "/", $zip);

/*si encuentra un archivo imprimimos la ruta donde se encuentra
* y agregamos el archivo al zip junto con su ruta 
*/
} elseif (is_file($dir . $archivo) && $archivo != "." && $archivo != "..") {
echo "Agregando archivo: $dir$archivo <br/>";
$zip->addFile($dir . $archivo, $dir . $archivo);
}
}
//cerramos el directorio abierto en el momento
closedir($da);
}
}
}

Instanciar a la función ZipArchive

Debemos de llamar a la función predeterminada del PHP que se encarga de comprimir archivos y carpetas en PHP. Por lo tanto, haciendo uso de una variable podemos agregar la carpeta a comprimir.

Luego haciendo uso de la función file_exists podemos verificar la existencia del archivo y luego enviarlo a una etiqueta de enlace para que el usuario final pueda descargar vía navegador.

//creamos una instancia de ZipArchive
$zip = new ZipArchive();

/*directorio a comprimir
* la barra inclinada al final es importante
* la ruta debe ser relativa no absoluta
*/
$dir = 'fuente/';

//ruta donde guardar los archivos zip, ya debe existir
$rutaFinal = "archivos";

if(!file_exists($rutaFinal)){
mkdir($rutaFinal);
}

$archivoZip = "mis_archivos.zip";

if ($zip->open($archivoZip, ZIPARCHIVE::CREATE) === true) {
agregar_zip($dir, $zip);
$zip->close();

//Muevo el archivo a una ruta
//donde no se mezcle los zip con los demas archivos
rename($archivoZip, "$rutaFinal/$archivoZip");

//Hasta aqui el archivo zip ya esta creado
//Verifico si el archivo ha sido creado
if (file_exists($rutaFinal. "/" . $archivoZip)) {
echo "Proceso Finalizado!! <br/><br/>
Descargar: <a href='$rutaFinal/$archivoZip'>$archivoZip</a>";
} else {
echo "Error, archivo zip no ha sido creado!!";
}
}

Código completo: Fichero crear.php

Aquí les dejare el script completo para que puedan guardar en un fichero de nombre crear.php, solo necesitarían una carpeta y dentro de esa carpeta archivos de texto, etc.

  • Una carpeta a comprimir puede contener carpetas y archivos diversos y para leer todo nos apoyaremos del ciclo WHILE.
  • La variable $dir ahi deben de declarar el nombre de la carpeta que desean comprimir
  • Variable $rutaFinal  es donde se almacenarán los archivos ZIP creados por PHP
  • Además, podemos asignar un nombre personalizado para nuestro archivo ZIP en la variable $archivoZip
  • Verificar, para verificar si la creación del ZIP fue un éxito usamos la función file_exists
<?php
echo "<strong>Lista de archivos leidos</strong>";
echo "<hr>";
function agregar_zip($dir, $zip) {
//verificamos si $dir es un directorio
if (is_dir($dir)) {
//abrimos el directorio y lo asignamos a $da
if ($da = opendir($dir)) {
//leemos del directorio hasta que termine

while (($archivo = readdir($da)) !== false) {
/*Si es un directorio imprimimos la ruta
* y llamamos recursivamente esta función
* para que verifique dentro del nuevo directorio
* por mas directorios o archivos
*/
if (is_dir($dir . $archivo) && $archivo != "." && $archivo != "..") {
echo "<strong>Creando directorio: $dir$archivo</strong><br/>";
agregar_zip($dir . $archivo . "/", $zip);

/*si encuentra un archivo imprimimos la ruta donde se encuentra
* y agregamos el archivo al zip junto con su ruta 
*/
} elseif (is_file($dir . $archivo) && $archivo != "." && $archivo != "..") {
echo "Agregando archivo: $dir$archivo <br/>";
$zip->addFile($dir . $archivo, $dir . $archivo);
}
}
//cerramos el directorio abierto en el momento
closedir($da);
}
}
}

//fin de la función
//creamos una instancia de ZipArchive
$zip = new ZipArchive();

/*directorio a comprimir
* la barra inclinada al final es importante
* la ruta debe ser relativa no absoluta
*/
$dir = 'fuente/';

//ruta donde guardar los archivos zip, ya debe existir
$rutaFinal = "archivos";

if(!file_exists($rutaFinal)){
mkdir($rutaFinal);
}

$archivoZip = "mis_archivos.zip";

if ($zip->open($archivoZip, ZIPARCHIVE::CREATE) === true) {
agregar_zip($dir, $zip);
$zip->close();

//Muevo el archivo a una ruta
//donde no se mezcle los zip con los demas archivos
rename($archivoZip, "$rutaFinal/$archivoZip");

//Hasta aqui el archivo zip ya esta creado
//Verifico si el archivo ha sido creado
if (file_exists($rutaFinal. "/" . $archivoZip)) {
echo "<hr>Proceso Finalizado!! <br/><br/>
Descargar: <a href='$rutaFinal/$archivoZip'>$archivoZip</a>";
} else {
echo "Error, archivo zip no ha sido creado!!";
}
}
?>

Descargar ZIP en PHP

Crearemos un archivo ZIP usando un simple formulario HTML y en la acción del formulario apuntaremos al fichero que genera el ZIP, veamos un ejemplo de formulario.

<html>
<head>
<title>Descargar ZIP usando formulario</title>
</head>
<body>
<h4>Descargar ZIP</h4>

<form action='descargar_zip.php'>
<input type='submit' value='Descargar ahora!' />
</form>
</body>
</html>

Configurar la descarga del ZIP

Para crear el ZIP tenemos este código en la parte inferior, lo que hace es verificar la existencia del ZIP creado y lanzarlo para que el usuario le de clic y pueda descargar.

//Verifico si el archivo ha sido creado
if (file_exists($rutaFinal. "/" . $archivoZip)) {
echo "<hr>Proceso Finalizado!! <br/><br/>
Descargar: <a href='$rutaFinal/$archivoZip'>$archivoZip</a>";
} else {
echo "Error, archivo zip no ha sido creado!!";
}

Zip enviado al navegador

Si deseamos que al presionar un botón se genere la descarga de manera inmediata debemos de cambiar estas líneas a este que propongo.

if (file_exists($rutaFinal. "/" . $archivoZip)) {
//Definimos el primer header como un archivo binario generico
header("Content-type: application/octet-stream");

//Este header indica un archivo adjunto el cual tendra un nombre
header("Content-Disposition: attachment; filename=\"".$archivoZip."\"");

//leemos el archivo de la ruta para enviarlo al navegador
readfile("$rutaFinal/$archivoZip");
} else {
echo "Error, archivo zip no ha sido creado!!";
}

Código completo

Aquí ya tenemos el código completo y listo para que comprima las carpetas, pueden copiar y agregarle al archivo llamado descargar_zip.php y listo.

Solo faltaría configurar la carpeta a comprimir y el nombre del nuevo fichero zip

<?php

function agregar_zip($dir, $zip) {
//verificamos si $dir es un directorio
if (is_dir($dir)) {
//abrimos el directorio y lo asignamos a $da
if ($da = opendir($dir)) {
//leemos del directorio hasta que termine
while (($archivo = readdir($da)) !== false) {
/*Si es un directorio imprimimos la ruta
* y llamamos recursivamente esta función
* para que verifique dentro del nuevo directorio
* por mas directorios o archivos
*/
if (is_dir($dir . $archivo) && $archivo != "." && $archivo != "..") {
echo "<strong>Creando directorio: $dir$archivo</strong><br/>";
agregar_zip($dir . $archivo . "/", $zip);

/*si encuentra un archivo imprimimos la ruta donde se encuentra
* y agregamos el archivo al zip junto con su ruta 
*/
} elseif (is_file($dir . $archivo) && $archivo != "." && $archivo != "..") {
echo "Agregando archivo: $dir$archivo <br/>";
$zip->addFile($dir . $archivo, $dir . $archivo);
}
}
//cerramos el directorio abierto en el momento
closedir($da);
}
}
}

//fin de la función
//creamos una instancia de ZipArchive
$zip = new ZipArchive();

/*directorio a comprimir
* la barra inclinada al final es importante
* la ruta debe ser relativa no absoluta
*/
$dir = 'fuente/';

//ruta donde guardar los archivos zip, ya debe existir
$rutaFinal = "archivos";

if(!file_exists($rutaFinal)){
mkdir($rutaFinal);
}

$archivoZip = "mis_archivos.zip";

if ($zip->open($archivoZip, ZIPARCHIVE::CREATE) === true) {
agregar_zip($dir, $zip);
$zip->close();

//Muevo el archivo a una ruta
//donde no se mezcle los zip con los demas archivos
rename($archivoZip, "$rutaFinal/$archivoZip");

//Hasta aqui el archivo zip ya esta creado
//Verifico y descargo el archivo creado

if (file_exists($rutaFinal. "/" . $archivoZip)) {
//Definimos el primer header como un archivo binario generico
header("Content-type: application/octet-stream");

//Este header indica un archivo adjunto el cual tendra un nombre
header("Content-Disposition: attachment; filename=\"".$archivoZip."\"");

//leemos el archivo de la ruta para enviarlo al navegador
readfile("$rutaFinal/$archivoZip");
} else {
echo "Error, archivo zip no ha sido creado!!";
}
}
?>

Conclusión

En este articulo hemos aprendido a crear ficheros Zip usando el lenguaje PHP a través de una función y llamando a la clase por defecto llamado ZipArchive().

Recuerden que pueden configurar y/o cambiar el nombre de la carpeta, además de elegir un nombre personalizado para nuestros ficheros ZIP creados con PHP.

Por otro lado, cuando se crean los archivos se almacenarán en la carpeta llamado “archivos” pero pueden cambiarlo a criterio de cada uno.

Pueden configurarlo para que sea más dinámico y usar formularios para crear el nombre de archivo ZIP. Espero que este articulo les ayude en sus proyectos web y no s olviden de compartir en las redes sociales.

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

Deja una respuesta

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

Botón volver arriba