Laravel Livewire 支持文件上传与进度条显示,需配置临时路径、设置磁盘并创建组件,通过 WithFileUploads 实现上传功能,在 Blade 中结合 wire:loading 与 JavaScript 钩子模拟进度条,提升用户体验。

Laravel Livewire 提供了简洁的方式处理文件上传,同时配合前端可以实现上传进度条。整个过程无需手动编写大量 JavaScript,适合在现代化 Laravel 项目中快速集成。
Livewire 原生支持文件上传,但需要确保配置正确:
php artisan livewire:publish --assets
使用 Artisan 命令创建组件:
php artisan make:livewire FileUpload编辑生成的组件类:
<?php
<p>namespace App\Livewire;</p><p>use Livewire\Component;
use Livewire\WithFileUploads;</p><p>class FileUpload extends Component
{
use WithFileUploads;</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">public $file;
public $uploadProgress = 0;
public function save()
{
$this->validate([
'file' => 'required|file|max:10240', // 最大 10MB
]);
$path = $this->file->storeAs(
'uploads',
$this->file->getClientOriginalName(),
'public'
);
$this->reset('file');
session()->flash('message', '文件上传成功!');
}
public function updatedFile()
{
// 可在这里触发上传开始提示
}
public function render()
{
return view('livewire.file-upload');
}}
Livewire 不直接提供上传进度数值,但可通过监听 xhr 请求模拟进度条。
创建视图 resources/views/livewire/file-upload.blade.php:
<div>
<form wire:submit.prevent="save">
<input type="file" wire:model="file" />
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"> {{-- 显示验证错误 --}}
@error('file') <span class="text-red-500">{{ $message }}</span> @enderror
{{-- 上传中显示进度条 --}}
<div wire:loading wire:target="file" class="mt-2">
<progress id="progress-bar" value="0" max="100"></progress>
<span id="progress-text">0%</span>
</div>
<button type="submit" class="mt-3">上传文件</button>
</form>
@if (session()->has('message'))
<div class="text-green-500 mt-2">{{ session('message') }}</div>
@endif</div>
<script> document.addEventListener('livewire:load', function () { const progressBar = document.getElementById('progress-bar'); const progressText = document.getElementById('progress-text');
Livewire.hook('message.sent', () => {
if (Livewire.hook('request.url').includes('file')) {
let interval = setInterval(() => {
if (progressBar.value < 90) {
progressBar.value += 1;
progressText.textContent = Math.round(progressBar.value) + '%';
} else {
clearInterval(interval);
}
}, 200);
}
});
Livewire.hook('message.received', () => {
progressBar.value = 100;
progressText.textContent = '100%';
});
Livewire.hook('message.failed', () => {
progressText.textContent = '上传失败';
});}); </script>
可以为进度条添加简单样式提升视觉效果:
<style>
progress {
width: 100%;
height: 20px;
border-radius: 4px;
}
</style>
也可替换为 div 模拟的进度条,便于自定义外观。
基本上就这些。Livewire 的文件上传机制结合简单的 JS 钩子,就能实现带进度反馈的体验。虽然不能精确获取服务器传输字节,但模拟进度已能满足大多数场景。注意大文件建议配合后端分片或使用专用上传库增强稳定性。
以上就是laravel Livewire如何实现文件上传和进度条_Laravel Livewire文件上传与进度条实现方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号