filament/spatie-laravel-media-library-plugin
Filament plugin integrating Spatie Laravel Media Library. Adds a SpatieMediaLibraryFileUpload form field with the same API as Filament’s FileUpload, supporting media collections and configurable disks, while storing uploads via the Media Library.
Installation
composer require filament/spatie-laravel-media-library-plugin
Publish the plugin assets and config:
php artisan vendor:publish --provider="Filament\SpatieMediaLibraryPlugin\SpatieMediaLibraryPluginServiceProvider"
Configure Media Library
Ensure spatie/laravel-medialibrary is installed and configured in your Laravel app. Run:
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider"
Configure your model to use the trait:
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
class Post extends Model
{
use HasMedia, InteractsWithMedia;
}
Register the Plugin
Add the plugin to your Filament admin panel in app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\Filament\SpatieMediaLibraryPlugin::make(),
]);
}
First Use Case Attach a media field to a Filament resource:
use Filament\Forms\Components\SpatieMediaLibraryFileUpload;
public static function form(Form $form): Form
{
return $form->schema([
SpatieMediaLibraryFileUpload::make('image')
->collection('images')
->image()
->required(),
]);
}
Media Collections Define collections in your model to organize media:
class Post extends Model
{
use HasMedia, InteractsWithMedia;
public function registerMediaCollections(): void
{
$this->addMediaCollection('images');
$this->addMediaCollection('documents');
}
}
Field Configuration Customize media upload fields in Filament resources:
SpatieMediaLibraryFileUpload::make('thumbnail')
->collection('images')
->image()
->directory('thumbnails')
->openable()
->required()
->maxSize(2048) // 2MB
->imageResizeMode('cover')
->imageResizeTargetWidth(300)
->imageResizeTargetHeight(300),
Table Display Show media in Filament tables:
use Filament\Tables\Columns\SpatieMediaLibraryImageColumn;
public static function table(Table $table): Table
{
return $table->columns([
SpatieMediaLibraryImageColumn::make('image')
->collection('images')
->width(50)
->height(50),
]);
}
Bulk Actions Add bulk actions to manage media:
public static function table(Table $table): Table
{
return $table->columns([
// ...
])->actions([
Tables\Actions\DeleteAction::make(),
])->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
SpatieMediaLibraryBulkDeleteAction::make(),
]),
]);
}
Media Upload Workflow
SpatieMediaLibraryFileUpload in forms for drag-and-drop uploads.Media Management Workflow
/admin/media-library).Integration with Existing Media
Media::addRemoteMedia().Custom Disk Configuration
Override the default disk in the plugin config (config/filament-spatie-media-library.php):
'disk' => 's3',
Custom Thumbnail Generators Extend the plugin’s thumbnail logic by publishing and overriding views:
php artisan vendor:publish --tag="filament-spatie-media-library-plugin-views"
Event Listeners Listen for media events to trigger custom logic:
use Spatie\MediaLibrary\Events\MediaWasAdded;
MediaWasAdded::listen(function (MediaWasAdded $event) {
// Send notification or log the upload
});
API Integration Expose media endpoints via Filament’s API resources:
use Filament\Resources\Resource;
use Filament\Resources\Tables;
use Filament\Tables;
class MediaLibraryResource extends Resource
{
public static function table(Table $table): Table
{
return $table->columns([
// ...
]);
}
}
Collection Mismatches
collection attribute in Filament fields matches the collections registered in your model. Mismatches will result in silent failures or empty uploads.registerMediaCollections() and field configurations.Disk Permissions
storage/app/public directory is writable.php artisan storage:link and check .env for correct disk settings.Large File Uploads
upload_max_filesize in php.ini) may block large uploads.php.ini or use chunked uploads with libraries like spatie/laravel-uploads.Caching Issues
php artisan filament:cache:clear) or use Media::refreshCache().Concurrent Uploads
registerMediaConversions().Log Media Events Enable Spatie’s logging to debug media operations:
'logging' => [
'enabled' => true,
'channel' => 'single',
],
in config/medialibrary.php.
Check Disk Contents Verify files are being saved to the correct disk:
php artisan storage:disk --list
php artisan storage:link
Filament Plugin Debugging Enable debug mode for the plugin:
SpatieMediaLibraryPlugin::make()->debug(true),
in your AdminPanelProvider.
Database Integrity
Ensure the media table exists and has the correct structure:
php artisan migrate
Default Collection The plugin assumes a default collection if none is specified. Override in config:
'default_collection' => 'default',
Directory Structure
Custom directories (e.g., directory('thumbnails')) are relative to the collection’s root. Ensure paths are correct:
storage/app/public/images/thumbnails/
Mime Type Restrictions The plugin enforces MIME type validation. Extend allowed types in config:
'allowed_mime_types' => [
'images' => ['image/jpeg', 'image/png', 'image/webp'],
'documents' => ['application/pdf', 'application/msword'],
],
Custom Media Models
Extend the default Spatie\MediaLibrary\Models\Media model:
class CustomMedia extends \Spatie\MediaLibrary\Models\Media
{
protected $casts = [
'custom_field' => 'boolean',
];
}
Update the plugin’s config to use your model:
'model' => \App\Models\CustomMedia::class,
Custom Fields
Create reusable media fields by extending SpatieMediaLibraryFileUpload:
class CustomMediaUpload extends SpatieMediaLibraryFileUpload
{
protected string $view = 'filament.spatie-media-library-plugin.custom-field';
public function configure(): static
{
return $this->image()->required();
}
}
Custom Actions Add actions to the media manager panel:
use Filament\Tables\Actions\Action;
SpatieMediaLibraryPlugin::make()->registerTableActions([
Action::make('customAction')
->action(function (Media $record) {
How can I help you explore Laravel packages today?