Saltearse al contenido

Descarga de Archivos

La descarga de archivos en Livewire funciona de forma muy similar a Laravel. Normalmente, puede utilizar cualquier utilidad de descarga de Laravel dentro de un componente Livewire, y debería funcionar como se espera.

Sin embargo, detrás de las escenas, las descargas de archivos se manejan de manera diferente que en una aplicación estándar de Laravel. Cuando se utiliza Livewire, el contenido del archivo se codifica en Base64, se envía al frontend, y se decodifica de nuevo en binario para ser descargado directamente desde el cliente.

Uso básico

Activar la descarga de un archivo en Livewire es tan sencillo como devolver una respuesta de descarga estándar de Laravel.

A continuación se muestra un ejemplo de un componente ShowInvoice que contiene un botón “Descargar” para descargar el PDF de la factura:

<?php
namespace App\Livewire;
use Livewire\Component;
use App\Models\Invoice;
class ShowInvoice extends Component
{
public Invoice $invoice;
public function mount(Invoice $invoice)
{
$this->invoice = $invoice;
}
public function download()
{
return response()->download(
$this->invoice->file_path, 'invoice.pdf'
);
}
public function render()
{
return view('livewire.show-invoice');
}
}
<div>
<h1>{{ $invoice->title }}</h1>
<span>{{ $invoice->date }}</span>
<span>{{ $invoice->amount }}</span>
<button type="button" wire:click="download">Descargar</button>
</div>

Al igual que en un controlador Laravel, también puedes utilizar la fachada Storage para iniciar descargas:

public function download()
{
return Storage::disk('invoices')->download('invoice.csv');
}

Descargas en streaming

Livewire también puede transmitir descargas; sin embargo, no son realmente transmitidas. La descarga no se activa hasta que el contenido del archivo se recoge y se entrega al navegador:

public function download()
{
return response()->streamDownload(function () {
echo '...'; // Echo descargar contenidos directamente...
}, 'invoice.pdf');
}

Testing de descargas de archivos

Livewire también proporciona un método ->assertFileDownloaded() para comprobar fácilmente que se ha descargado un archivo con un nombre determinado:

use App\Models\Invoice;
/** @test */
public function can_download_invoice()
{
$invoice = Invoice::factory();
Livewire::test(ShowInvoice::class)
->call('download')
->assertFileDownloaded('invoice.pdf');
}

También puede comprobar que un archivo no se ha descargado utilizando el método ->assertNoFileDownloaded():

use App\Models\Invoice;
/** @test */
public function does_not_download_invoice_if_unauthorised()
{
$invoice = Invoice::factory();
Livewire::test(ShowInvoice::class)
->call('download')
->assertNoFileDownloaded();
}