文件上传
概述
文件上传(FileUpload)字段是基于 Filepond 的。
use Filament\Forms\Components\FileUpload;
FileUpload::make('attachment')

Filament 也支持
spatie/laravel-medialibrary。更多详情请查阅插件文档。
配置存储磁盘和存储目录
默认情况下,文件会公开上传到配置文件中定义的存储盘。你也可以设置 FILAMENT_FILESYSTEM_DISK 环境变量对此进行修改。
要正确预览图片及其他文件,FilePond 要求将文本保存到与应用相同的域名中,或者设置合适的 CORS 头。请确保
APP_URL环境变量设置正确;或者修改文件系统(filesystem)驱动,设置成正确的 URL。如果文件托管到另外的域名,比如 S3,请确保设置了 CORS 头部。
要为特定字段修改磁盘和目录以及文件的可见度,请使用 disk()、directory() 及 visibility() 方法:
use Filament\Forms\Components\FileUpload;
FileUpload::make('attachment')
->disk('s3')
->directory('form-attachments')
->visibility('private')
是否从磁盘中删除这些文件由开发者决定,因为 Filament 无从知晓这些图片是否由其他地方的依赖。其中一种自动实现方式是监测模型事件。
多文件上传
你也可以上传多个文件。URL 以 JSON 格式存储:
use Filament\Forms\Components\FileUpload;
FileUpload::make('attachments')
->multiple()
如果你使用 Eloquent 来保存文件 URL,请确保将 array [casts] 添加到对应的模型属性中:
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
protected $casts = [
'attachments' => 'array',
];
// ...
}
控制文件名
默认情况下,新上传的文件会生成随机文件名。这是为了确保不会和现有的文件产生冲突。
保留原始文件名
使用 preserveFilenames() 方法,可以保留上传文件的原始文件名:
use Filament\Forms\Components\FileUpload;
FileUpload::make('attachment')
->preserveFilenames()
生成自定义文件名
使用 getUploadedFileNameForStorageUsing() 方法,你可以完全自定义文件名的生成方式,并基于上传的文件 $file 在闭包中返回字符串:
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
FileUpload::make('attachment')
->getUploadedFileNameForStorageUsing(
fn (TemporaryUploadedFile $file): string => (string) str($file->getClientOriginalName())
->prepend('custom-prefix-'),
)
将原始文件名单独存储
使用 storeFileNamesIn() 方法,你可以保留随机生成的文件名的同时,将原始文件名存储起来:
use Filament\Forms\Components\FileUpload;
FileUpload::make('attachments')
->multiple()
->storeFileNamesIn('attachment_file_names')
attachment_file_names 现在将会存储上传文件的原始文件名,在表单提交后将其存入到数据库中。如果通过 multiple() 实现多文件上传,请确保将 array [casts] 添加到该 Eloquent 模型属性中。
头像模式
使用 avatar() 方法,你可以为上传文件启用头像模式:
use Filament\Forms\Components\FileUpload;
FileUpload::make('avatar')
->avatar()
这只允许上传图片,并且在上传后它将会在一个紧凑的圆中展示图片,这很适合于头像。
该特性与圆形裁切是绝佳匹配。
图片编辑器
你可以使用 imageEditor() 方法,为文件上传字段启用图片编辑器:
use Filament\Forms\Components\FileUpload;
FileUpload::make('image')
->image()
->imageEditor()
当你通过点击铅笔图标上传图片时,你可以打开该编辑器。你也可以在现有图片上点击铅笔图标打开图片编辑器,这将在保存时删除并重新上传图片。
允许用户按长宽比裁切图片
使用 imageEditorAspectRatios() 方法,你可以允许用户按照一套指定的长宽比裁切图片:
use Filament\Forms\Components\FileUpload;
FileUpload::make('image')
->image()
->imageEditor()
->imageEditorAspectRatios([
'16:9',
'4:3',
'1:1',
])
传入 null 作为选项,你也可以允许用户不选择长宽比:
use Filament\Forms\Components\FileUpload;
FileUpload::make('image')
->image()
->imageEditor()
->imageEditorAspectRatios([
null,
'16:9',
'4:3',
'1:1',
])
设置图片编辑器模式
使用 imageEditorMode() 方法,你可以修改图片编辑器模式,该方法可接收 1、2 或 3 作为参数。这些选项的解释可以在 Cropper.js 文档中查看:
use Filament\Forms\Components\FileUpload;
FileUpload::make('image')
->image()
->imageEditor()
->imageEditorMode(2)
自定义图片编辑器的空填充色
默认情况下,图片编辑器会使图片周围的空白区域透明。使用 imageEditorEmptyFillColor() 方法可以自定义空白区域的填充色:
use Filament\Forms\Components\FileUpload;
FileUpload::make('image')
->image()
->imageEditor()
->imageEditorEmptyFillColor('#000000')
设置图片编辑器的视窗大小
使用 imageEditorViewportWidth() 和 imageEditorViewportHeight() 方法可以修改图片编辑器的视窗,在跨设备中使用会生成长宽比:
use Filament\Forms\Components\FileUpload;
FileUpload::make('image')
->image()
->imageEditor()
->imageEditorViewportWidth('1920')
->imageEditorViewportHeight('1080')
允许用户将图片裁切成圆
使用 circleCropper() 方法,可以允许用户将图片裁切成圆:
use Filament\Forms\Components\FileUpload;
FileUpload::make('image')
->image()
->avatar()
->imageEditor()
->circleCropper()
这与 avatar() 方法完美结合,其以紧凑的圆形布局渲染图像。
