Installation:
composer require coka/file-bundle
Add the bundle to your config/bundles.php (Symfony) or manually register it in AppServiceProvider (Laravel via Symfony bridge):
// config/app.php (if using Laravel/Symfony bridge)
'extra.bundles' => [
CedrickOka\OkaFileBundle\OkaFileBundle::class => ['all' => true],
];
Publish Config:
php artisan vendor:publish --provider="CedrickOka\OkaFileBundle\OkaFileBundle" --tag="config"
This generates config/oka_file.php. Key settings:
return [
'storage' => [
'path' => storage_path('app/oka_files'),
'url' => env('APP_URL').'/storage/oka_files',
],
'allowed_mime_types' => ['image/jpeg', 'image/png', 'application/pdf'],
];
First Use Case: Upload a file via a controller:
use CedrickOka\OkaFileBundle\Service\FileManager;
public function upload(Request $request, FileManager $fileManager) {
$file = $request->file('file');
$path = $fileManager->upload($file, 'user_uploads');
return response()->json(['path' => $path]);
}
File Uploads:
FileManager service for handling uploads with validation:
$fileManager->upload($file, 'folder_name', [
'max_size' => '10M',
'mime_types' => ['image/*'],
]);
ChunkedFileManager.File Retrieval:
return $fileManager->stream('folder/file.pdf');
$url = $fileManager->getSignedUrl('folder/file.pdf', now()->addHours(1));
File Management:
$files = $fileManager->listFiles('folder_name');
$fileManager->delete('folder/file.pdf');
Integration with Laravel:
Illuminate\Foundation\Http\FormRequest to validate files:
public function rules() {
return [
'file' => 'required|file|mimes:jpeg,png,pdf|max:10240',
];
}
config('oka_file.storage.path') in filesystems.php:
'disks' => [
'oka_files' => [
'driver' => 'local',
'root' => config('oka_file.storage.path'),
],
],
Event Handling:
// In EventServiceProvider
protected $listen = [
'CedrickOka\OkaFileBundle\Event\FileUploaded' => [
'App\Listeners\LogUploadedFile',
],
];
Symfony Dependency:
AppServiceProvider if not using Symfony bridge.Event facade instead of Symfony’s EventDispatcher).Configuration Overrides:
php artisan vendor:publish to avoid runtime errors.Mime Type Validation:
allowed_mime_types in config is strict. Extend it in your config:
'allowed_mime_types' => [
'image/jpeg', 'image/png', 'image/gif',
'application/pdf', 'application/msword',
],
Storage Permissions:
storage_path('app/oka_files') directory is writable:
mkdir -p storage/app/oka_files && chmod -R 775 storage/app/oka_files
Chunked Uploads:
Log File Operations:
config/oka_file.php:
'debug' => env('APP_DEBUG', false),
storage/logs/oka_file.log.Validate File Paths:
FileManager::getAbsolutePath('folder/file') to debug paths. Always escape user input to prevent directory traversal:
$safePath = $fileManager->sanitizePath($userInput);
Symfony Container Issues:
// In AppServiceProvider boot()
$this->app->register(CedrickOka\OkaFileBundle\OkaFileBundle::class);
Custom Storage Drivers:
CedrickOka\OkaFileBundle\Storage\StorageInterface to support S3, FTP, etc.:
class S3Storage implements StorageInterface {
public function save($file, $path) { ... }
// Implement other methods
}
AppServiceProvider:
$this->app->bind(
StorageInterface::class,
S3Storage::class
);
File Filters:
use CedrickOka\OkaFileBundle\Event\FileUploaded;
public function handle(FileUploaded $event) {
$filePath = $event->getPath();
// Resize images, convert formats, etc.
}
API Responses:
// In a controller
$metadata = $fileManager->getMetadata('folder/file.pdf');
return response()->json([
'path' => $metadata['path'],
'size' => $metadata['size'],
'mime' => $metadata['mime'],
'custom_field' => 'your_data',
]);
How can I help you explore Laravel packages today?