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.
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');
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
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);
}
}
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.