PHP code example of georgemosesgroup / filament-media-library
1. Go to this page and download the library: Download georgemosesgroup/filament-media-library library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
georgemosesgroup / filament-media-library example snippets
use Alura\FilamentMediaLibrary\FilamentMediaLibraryPlugin;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->plugins([
FilamentMediaLibraryPlugin::make(),
]);
}
FilamentMediaLibraryPlugin::make()
->navigationGroup('Content') // Group in navigation
->navigationSort(10) // Sort order
->navigationIcon('heroicon-o-folder') // Custom icon
->navigationLabel('Files') // Custom label
FilamentMediaLibraryPlugin::make()
->disableMediaLibraryPage()
return [
// Storage disk
'disk' => env('MEDIA_LIBRARY_DISK', 'public'),
// Upload limits
'upload' => [
'max_file_size' => 100 * 1024 * 1024, // 100MB
'max_files_per_upload' => 50,
],
// Multi-tenancy
'multi_tenancy' => [
'enabled' => true,
'tenant_column' => 'tenant_id',
],
// Modal appearance
'picker' => [
'default_position' => 'slide-over', // 'center' or 'slide-over'
'default_width' => 'md',
],
];
'disks' => [
// ... other disks
// DigitalOcean Spaces
'do_spaces' => [
'driver' => 's3',
'key' => env('DO_SPACES_KEY'),
'secret' => env('DO_SPACES_SECRET'),
'region' => env('DO_SPACES_REGION', 'sfo3'),
'bucket' => env('DO_SPACES_BUCKET'),
'url' => env('DO_SPACES_URL'),
'endpoint' => env('DO_SPACES_ENDPOINT'),
'use_path_style_endpoint' => false,
'visibility' => 'public',
],
// AWS S3
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'visibility' => 'public',
],
],
use Alura\FilamentMediaLibrary\Forms\Components\MediaPicker;
public static function form(Form $form): Form
{
return $form->schema([
// Single image - browse from library
MediaPicker::make('cover_image_id')
->label('Cover Image')
->images(),
// Multiple images - browse from library
MediaPicker::make('gallery_ids')
->label('Gallery')
->images()
->multiple()
->maxFiles(10),
]);
}
MediaPicker::make('cover_image_id')
->label('Cover Image')
->images()
->allowUpload() // Enable drag & drop upload
->directory('Products/{record_id}/Cover')
class Product extends Model
{
protected $fillable = [
'name',
'cover_image_id', // integer - single file
'gallery_ids', // json - multiple files
];
protected function casts(): array
{
return [
'gallery_ids' => 'array', // Required for multiple files
];
}
}
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->foreignId('cover_image_id')->nullable()->constrained('file_items')->nullOnDelete();
$table->json('gallery_ids')->nullable();
$table->timestamps();
});
MediaPicker::make('cover_image_id')
->images()
->directory('Products/{record_id}/Cover')
// Only images
MediaPicker::make('image_id')->images()
// Only videos
MediaPicker::make('video_id')->videos()
// Only documents
MediaPicker::make('document_id')->documents()
// Custom mime types
MediaPicker::make('file_id')->acceptedTypes(['application/pdf', 'image/png'])
// Single file (default)
MediaPicker::make('cover_id')
// Multiple files
MediaPicker::make('gallery_ids')
->multiple()
->maxFiles(20)
->minFiles(1)
MediaPicker::make('image_id')
->modalPosition('center') // 'center' or 'slide-over'
->modalWidth('3xl') // sm, md, lg, xl, 2xl, 3xl, 4xl, 5xl
MediaPicker::make('image_id')
->directory('Uploads/{date}') // Auto folder structure
->autoCreateDirectory(true) // Create folders if not exist
->maxFileSize(10 * 1024 * 1024) // 10MB limit
MediaPicker::make('image_id')
-> => !auth()->user()->canUpload())
// Preset gallery layouts with configurable parameters
MediaPicker::make('gallery_ids')
->multiple()
->gridGallery() // Default: 3 columns, 120px height, cover
->gridGallery(4) // 4 columns
->gridGallery(4, '150px') // 4 columns, 150px height
->gridGallery(4, '150px', 'contain') // Full customization
// Other presets
MediaPicker::make('gallery_ids')
->multiple()
->compactGallery() // 2 columns, 150px height
->thumbnailGallery() // 4 columns, 100px height
->thumbnailGallery(6, '80px') // 6 columns, 80px height
// Manual configuration
MediaPicker::make('gallery_ids')
->multiple()
->previewColumns(4) // Number of columns (1-6)
->previewMaxHeight('150px') // Height of each item
->previewImageFit('cover') // 'cover', 'contain', or 'fill'
'cover_image_id' => 42
'gallery_ids' => [42, 43, 44]
class Product extends Model
{
// ... fillable and casts ...
// Relationship for eager loading
public function coverImage(): BelongsTo
{
return $this->belongsTo(FileItem::class, 'cover_image_id');
}
// Get cover URL
public function getCoverUrl(): ?string
{
return $this->coverImage?->getUrl();
}
// Get gallery images collection
public function getGalleryImages()
{
if (empty($this->gallery_ids)) {
return collect();
}
return FileItem::whereIn('id', $this->gallery_ids)->get();
}
// Get gallery URLs array
public function getGalleryUrls(): array
{
return $this->getGalleryImages()
->map(fn($img) => $img->getUrl())
->toArray();
}
}
// In API Resource or Controller
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'cover_image' => $this->coverImage ? [
'id' => $this->coverImage->id,
'url' => $this->coverImage->getUrl(),
'thumbnail' => $this->coverImage->getThumbnailUrl(),
] : null,
'gallery' => $this->getGalleryImages()->map(fn($img) => [
'id' => $img->id,
'url' => $img->getUrl(),
'thumbnail' => $img->getThumbnailUrl(),
]),
];
}
// config/filament-media-library.php
'thumbnails' => [
'enabled' => true,
// Run inline instead of pushing to the queue (handy in tests).
'sync' => env('MEDIA_THUMBS_SYNC', false),
'queue' => [
'connection' => env('MEDIA_THUMBS_QUEUE_CONNECTION'), // null = default
'name' => env('MEDIA_THUMBS_QUEUE_NAME', 'default'),
],
'driver' => env('MEDIA_THUMBS_DRIVER', 'auto'), // auto | imagick | gd
'thumbs_path' => env('MEDIA_THUMBS_PATH', 'thumbs'),
'sizes' => [1920, 1440, 1024, 768, 480, 320],
'format' => env('MEDIA_THUMBS_FORMAT', 'webp'), // webp | jpg | avif
'fallback_format' => 'jpg',
'quality' => 80,
'preserve_aspect_ratio' => true,
],
$item->thumbUrl(1024); // URL for one size, or null
$item->thumbUrl(1024, 'jpg'); // override format
$item->thumbnails(); // [1920 => url, 1440 => url, ...]
$item->getPreview(1024); // best fit for a target width
$item->hasThumbnails(); // bool — any responsive thumb on disk
$item->hasThumbnails(1024); // bool — specific size
bash
# Basic installation (local storage)
php artisan filament-media-library:install
# With DigitalOcean Spaces
php artisan filament-media-library:install --storage=do_spaces
# With AWS S3
php artisan filament-media-library:install --storage=s3
bash
php artisan vendor:publish --tag="filament-media-library-config"
bash
php artisan migrate
bash
php artisan filament:assets
bash
# Basic installation
php artisan filament-media-library:install
# With DigitalOcean Spaces storage
php artisan filament-media-library:install --storage=do_spaces
# With AWS S3 storage
php artisan filament-media-library:install --storage=s3
# Skip theme configuration
php artisan filament-media-library:install --skip-theme
bash
composer update georgemosesgroup/filament-media-library
php artisan filament:assets
php artisan view:clear