FileUpload завантажує файл через Livewire у тимчасове сховище, а під час збереження форми переносить його на диск і записує в атрибут моделі шлях до файлу.
use Filament\Forms\Components\FileUpload;
FileUpload::make('cover')
->image()
->disk('public')
->directory('covers')
->visibility('public')
->maxSize(2048); // кілобайти
Чому зображення не відкривається - найчастіші причини:
- Видимість
privateза замовчуванням. Файли завантажуються з приватною видимістю, якщо диск неpublic. На S3 чи R2 без->visibility('public')пряме посилання на файл повертає 403. - Диск за замовчуванням - той, що в
FILESYSTEM_DISK, частоlocal. Файли з нього взагалі не віддаються вебсервером. - Немає
storage:linkдля дискаpublic. - Неправильний
APP_URL- URL файлів будується з нього, і превью в FilePond не завантажується.
Кілька файлів:
FileUpload::make('attachments')
->multiple()
->acceptedFileTypes(['application/pdf'])
->maxFiles(5);
Шляхи зберігаються JSON-масивом, тож атрибут моделі потребує касту array.
Безпека імен файлів. За замовчуванням Filament генерує випадкові імена - і це правильно. preserveFilenames() на дисках local/public небезпечний: користувач може завантажити файл з розширенням .php. Якщо оригінальна назва потрібна для показу, її зберігають окремо: ->storeFileNamesIn('attachment_names').
Пастки:
- старі файли не видаляються. Коли користувач замінює чи прибирає файл, попередній лишається на диску. Прибирати треба самостійно, наприклад у спостерігачі моделі;
- ліміт розміру обмежує ще й Livewire (
temporary_file_uploadуconfig/livewire.php, за замовчуванням 12 МБ) таupload_max_filesizeу PHP -maxSize()більший за ці значення не допоможе; acceptedFileTypes()перевіряє MIME-тип, а не розширення - покладатися лише на нього для безпеки не варто.