bytescommerce/easy-admin-file-upload-field
Installation:
composer require bytescommerce/easy-admin-file-upload-field
Publish the package's assets (if needed):
php artisan vendor:publish --provider="BytesCommerce\FileUploadField\FileUploadFieldServiceProvider"
First Use Case:
Add a file upload field to an existing EasyAdmin CRUD controller (e.g., PostCrudController):
use BytesCommerce\FileUploadField\Field\FileField;
yield FileField::new('file', 'Document')
->setBasePath('uploads/documents')
->setUploadDir('public/uploads/documents');
new('field_name', 'label'): Maps to your model's attribute.setBasePath(): Relative path for storage (e.g., storage/app/uploads).setUploadDir(): Publicly accessible path (e.g., public/uploads).Verify:
config/easy-admin-file-upload-field.php for default settings.File::BASE_FILE_PATH (or your custom path) exists in storage/app and public.Basic Upload:
yield FileField::new('avatar', 'Profile Image')
->setBasePath('avatars')
->setUploadDir('public/avatars')
->setAllowedExtensions(['jpg', 'png', 'gif']);
config/easy-admin-file-upload-field.php).Dynamic Paths: Use closures for dynamic paths (e.g., per-record uploads):
yield FileField::new('attachment', 'Attachment')
->setBasePath(fn($entity) => "uploads/{$entity->id}")
->setUploadDir(fn($entity) => "public/uploads/{$entity->id}");
Integration with Model Events:
Hook into creating/updating to process files:
public function createEntity(EntityManager $entityManager, $entityInstance): void
{
$entityInstance->processUploadedFile(); // Custom logic
parent::createEntity($entityManager, $entityInstance);
}
Batch Processing:
For bulk uploads (e.g., CSV imports), use the FileField in a custom form:
yield FileField::new('import_file', 'CSV File')
->setBasePath('imports')
->setUploadDir('public/imports')
->setMaxFileSize(5); // 5MB
Custom Storage:
Override storage logic by extending FileField:
use BytesCommerce\FileUploadField\Field\FileField as BaseFileField;
class S3FileField extends BaseFileField {
public function getStoragePath(): string {
return Storage::disk('s3')->path($this->getBasePath());
}
}
Preview Thumbnails:
Use setImageField() to display thumbnails for images:
yield FileField::new('thumbnail', 'Thumbnail')
->setBasePath('thumbnails')
->setImageField('preview'); // Uses 'preview' attribute for thumbnail URL
Delete Handling:
Implement deleteEntity() to clean up files:
public function deleteEntity(EntityManager $entityManager, $entityInstance): void
{
if ($entityInstance->file) {
Storage::delete($entityInstance->file);
}
parent::deleteEntity($entityManager, $entityInstance);
}
Path Mismatches:
storage/app but aren’t accessible via public.setUploadDir() matches the symlinked path (e.g., public/uploads → symlink storage/app/uploads to public/uploads).php artisan storage:link and verify paths.Permission Errors:
500 Internal Server Error on upload.chmod -R 775 storage/app/uploads
chmod -R 775 public/uploads
File Overwrites:
setUploadedFileNamePattern() with [uuid].[extension]:
->setUploadedFileNamePattern('[uuid].[extension]')
EasyAdmin Cache:
FileField aren’t reflected.php artisan easy-admin:clear-cache
config/easy-admin-file-upload-field.php:
'debug' => env('APP_DEBUG', false),
dd() in createEntity()/updateEntity() to inspect $entityInstance for file attributes.local). Override in config/filesystems.php:
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app/uploads'),
],
],
Custom Validation:
Extend FileField to add rules:
use BytesCommerce\FileUploadField\Field\FileField;
class CustomFileField extends FileField {
public function configure(): void {
$this->setValidationRules([
'file' => 'required|file|mimes:pdf,docx|max:10240', // 10MB
]);
}
}
Post-Upload Processing:
Use setAfterUploadCallback():
yield FileField::new('document', 'Document')
->setAfterUploadCallback(function ($entity, $filePath) {
// Convert PDF to text, etc.
});
Frontend Customization: Override the default Twig template by publishing assets:
php artisan vendor:publish --tag=easy-admin-file-upload-field-views
Then modify resources/views/vendor/easy-admin-file-upload-field/field.html.twig.
Localization: Translate labels dynamically:
yield FileField::new('file', trans('admin.file_upload.label'))
->setBasePath(trans('admin.file_upload.path'));
How can I help you explore Laravel packages today?