Inicio Blog arrow-menu-nigmacode Videos Cursos Foro

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!

Preguntas relacionadas

No hay preguntas sobre este artículo.

¿Tienes alguna duda sobre el artículo? ¡Pregunta!