Comprimir archivos en Laravel

En nuestro artículo anterior llamado Subir archivos en laravel, aprendimos a guardar archivos en nuestra aplicación y hacer uso de ellos.

En este artículo vamos aprender a comprimir archivos que tenga nuestra aplicación antes de descargarlos, haciendo uso de la librería Zipper.

Añadiendo Zipper a nuestro proyecto laravel

Para hacer uso de Zipper, vamos a descargarlo en nuestro proyecto mediante composer:

composer require chumper/zipper

Una vez tengamos Zipper, nos dirigimos a config/app.php y en el apartado de providers y lo añadiremos:

...
...
Chumper\Zipper\ZipperServiceProvider::class,

Y más abajo, en el apartado de Aliases, le darémos el nombre con el que llamaremos a la librería:

...
...
'Zipper' => Chumper\Zipper\Zipper::class,

Comprimiendo y descargando nuestros archivos

Nos dirigimos al controlador donde queramos añadir esta funcionalidad, importaremos la librería Zipper y crearemos la siguiente función:

<?php

...
use Zipper;

class Controller extends BaseController
{
    ...

    public function comprimirDescargar()
    {
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,
          en este ejemplo comprimimos todos los que se encuentran en la carpeta 
          storage/app/public*/
        $files = glob(storage_path('app/public/*'));
        
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/
        Zipper::make(storage_path('app/public/ejemplo.zip'))->add($files)->close();
        
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre
        y lo descargaremos*/
        return response()->download(storage_path('app/public/ejemplo.zip'));
    }


}

En este caso, estamos haciendo uso de la ruta storage, ya que en el artículo anterior vimos como subir archivos a esta carpeta, pero también podemos hacer uso de la carpeta public cambiando el helper storage_path por public_path.

Ahora, creamos la ruta para llamar a la función:

Route::get('/comprimir', 'Controller@comprimirDescargar')->name('comprimir');

Y por último, podemos crear un enlace en nuestra vista para ver que todo funciona correctamente:

<a href="{{route('comprimir')}}">Comprimir y descargar</a>

De esta forma ¡Nos descargaría todo el contenido de la carpeta que le hayamos indicado en un archivo zip con el nombre de ejemplo.zip!