Ravakahn Gladior
Ravakahn Gladior Ravakahn foi um gladiador que, na Roma Antiga, lutava com outros gladiadores ou animais, às vezes, até a morte, para o entretenimento do público romano. há 4 anos

Como criar e fazer o download de um arquivo zip no Laravel 7?

Como criar e fazer o download de um arquivo zip no Laravel 7?

Neste tutorial, vou mostrar um exemplo de Laravel 7 para criar um arquivo zip a partir de um diretório e envia-lo ao cliente. O zip irá ser criado usando o ZipArchive do PHP em uma aplicação Laravel 7.

É altamente recomendável criar um arquivo zip sem usar dependencias instaladas via composer, porque você pode facilmente criar um arquivo zip usando a classe nativa ZipArchive. Esta classe fornece um método para adicionar arquivos com caminho relativo, para criar facilmente uma pasta dentro do seu arquivo zip.

Passo 1: Criar a rota

O primeiro passo é criar uma rota para fazer o download do arquivo compactado. Simplesmente adicione a linha no seu arquivo de rotas.

routes/web.php

Route::get('download-zip', 'ZipController');

Passo 2: Criar o controller

Agora devemos criar o controller que irá ser invocado pela rota download-zip. Execute a instrução a seguir para criar o ZipController.

php artisan make:controller -i ZipController

Passo 3: Implementar o Controller

Aqui vamos implementar o script que irá gerar um novo arquivo zip (meuZip.zip) e fazer o download como resposta.

app/Http/Controllers/ZipController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use ZipArchive;

class ZipController extends Controller
{
  public function __invoke(Request $request)
  {
    // Criar instancia de ZipArchive
    $zip = new ZipArchive;

    $fileName = 'meuZip.zip'; // nome do zip
    $zipPath = public_path($fileName); // path do zip

    if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE)
    {
      // arquivos que serao adicionados ao zip
      $files = File::files(public_path('meus-arquivos'));

      foreach ($files as $key => $value) {
        // nome/diretorio do arquivo dentro do zip
        $relativeNameInZipFile = basename($value);

        // adicionar arquivo ao zip
        $zip->addFile($value, $relativeNameInZipFile);
      }

      // concluir a operacao
      $zip->close();
    }

    return response()->download($zipPath);
  }
}

Passo 4: Testando

Ok, agora você pode executar o seu projeto e acessar a rota criada: http://localhost/download-zip.

Mas antes, certifique-se de ter a pasta meus-arquivos no diretório público, além de adicionar alguns arquivos neste mesmo diretório.

Referências: