文件下载
您是视觉学习者吗?
通过我们深入的屏幕录制掌握 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();}