文件下载

您是视觉学习者吗?
通过我们深入的屏幕录制掌握 Livewire
立即观看

Livewire 中的文件下载与 Laravel 本身中的工作方式基本相同。通常,您可以在 Livewire 组件中使用任何 Laravel 下载实用程序,并且它应该按预期工作。

但是,在幕后,文件下载的处理方式与标准 Laravel 应用程序中的不同。使用 Livewire 时,文件的内容会进行 Base64 编码,发送到前端,然后解码回二进制文件,以便直接从客户端下载。

基本用法

在 Livewire 中触发文件下载就像返回一个标准的 Laravel 下载响应一样简单。

下面是一个 ShowInvoice 组件的示例,其中包含一个“下载”按钮以下载发票 PDF

<?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">Download</button>
</div>

就像在 Laravel 控制器中一样,您还可以使用 Storage 外观来启动下载

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

流式下载

Livewire 还可以流式下载;但是,它们并不是真正流式传输的。下载不会触发,直到收集文件内容并将其传递给浏览器

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

测试文件下载

Livewire 还提供了一个 ->assertFileDownloaded() 方法,可以轻松测试是否下载了具有给定名称的文件

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

您还可以使用 ->assertNoFileDownloaded() 方法测试以确保没有下载文件

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