Installation Add the package via Composer:
composer require 201created/media-bundle
Publish the configuration:
php artisan vendor:publish --provider="201Created\MediaBundle\MediaBundleServiceProvider" --tag="config"
Run migrations (if using database storage):
php artisan migrate
Basic Setup
Register the bundle in config/app.php under providers:
201Created\MediaBundle\MediaBundleServiceProvider::class,
First Use Case: File Upload
Inject the MediaService into a controller or service:
use 201Created\MediaBundle\Services\MediaService;
public function uploadFile(Request $request, MediaService $mediaService)
{
$file = $request->file('file');
$media = $mediaService->upload($file, [
'disk' => 'public',
'path' => 'uploads',
]);
return response()->json($media);
}
File Upload & Storage
Use MediaService for handling uploads with configurable disks (S3, local, etc.):
$media = $mediaService->upload($file, [
'disk' => 's3',
'path' => 'user_uploads/{user_id}',
'visibility' => 'public', // For S3
]);
Media Metadata & Thumbnails Automatically extract metadata (e.g., EXIF for images) and generate thumbnails:
$media = $mediaService->upload($file, [
'generate_thumbnails' => true,
'thumbnail_sizes' => ['small', 'medium', 'large'],
]);
Validation & Policies
Validate file types/sizes via MediaValidator:
$validator = new MediaValidator();
$validator->allowedTypes(['image/jpeg', 'image/png']);
$validator->maxSize(5 * 1024 * 1024); // 5MB
$validator->validate($file);
Database Integration
Attach media to Eloquent models via HasMedia trait:
use 201Created\MediaBundle\Traits\HasMedia;
class Post extends Model
{
use HasMedia;
}
Then upload and associate:
$post = new Post();
$post->addMedia($file)->toMediaCollection('images');
Batch Processing Process multiple files in bulk:
$files = $request->file('files');
$media = $mediaService->uploadMultiple($files, [
'disk' => 'public',
'path' => 'batch_uploads',
]);
MediaService to support custom storage backends (e.g., FTP, Google Drive).MediaUploaded, MediaDeleted, etc., for post-processing:
event(new MediaUploaded($media));
return response()->json($media->toArray());
MediaService mocks in PHPUnit:
$mockMedia = Mockery::mock(Media::class);
$mediaService->shouldReceive('upload')->andReturn($mockMedia);
Disk Configuration
config/filesystems.php is properly set up for the target disk (e.g., S3 credentials, local paths).config/media.php:
'default_disk' => 'public',
Thumbnail Generation
intervention/image or spatie/image. Install via:
composer require intervention/image
config/media.php:
'thumbnail_path' => 'thumbnails/{filename}',
File Permissions
storage/app/public directory is writable:
chmod -R 775 storage/app/public
Memory Limits
memory_limit. Increase if needed:
ini_set('memory_limit', '512M');
Database Locking
DB::transaction(function () use ($mediaService, $file) {
$mediaService->upload($file, ['path' => uniqid()]);
});
config/media.php:
'log_uploads' => true,
php artisan event:listen MediaUploaded
php artisan config:clear
if changes to config/media.php aren’t reflected.Custom Storage Adapters
Implement 201Created\MediaBundle\Contracts\StorageAdapter for new backends.
Media Model Extensions
Extend the Media model to add custom fields:
class CustomMedia extends Media
{
protected $casts = [
'custom_field' => 'boolean',
];
}
Middleware for Uploads Restrict uploads by role/user:
public function handle($request, Closure $next)
{
if (!$request->user()->can('upload_files')) {
abort(403);
}
return $next($request);
}
Queue Uploads Offload processing to queues for large files:
$mediaService->upload($file)->onQueue('media');
How can I help you explore Laravel packages today?