darvinstudio/darvin-file-bundle
Installation Add the bundle via Composer:
composer require darvinstudio/darvin-file-bundle
Enable the bundle in config/bundles.php (Symfony 4+):
DarvinStudio\DarvinFileBundle\DarvinFileBundle::class => ['all' => true],
Configuration Publish the default config:
php bin/console darvin:file:install
Update config/packages/darvin_file.yaml to define storage paths, allowed extensions, and upload limits.
First Use Case Upload a file via a controller:
use DarvinStudio\DarvinFileBundle\Service\FileManager;
public function upload(Request $request, FileManager $fileManager)
{
$file = $request->files->get('file');
$result = $fileManager->upload($file, 'user_uploads');
return new JsonResponse($result);
}
Use the enctype="multipart/form-data" in your form.
File Uploads
FileManager service for handling uploads:
$result = $fileManager->upload($file, 'directory', ['max_size' => '10M']);
File Retrieval
$url = $fileManager->getUrl('filename.ext', 'user_uploads');
return $fileManager->stream('filename.ext', 'user_uploads');
File Deletion
$fileManager->delete('filename.ext', 'user_uploads');
Custom Directories
darvin_file:
directories:
user_uploads: '%kernel.project_dir%/public/uploads/users'
profile_avatars: '%kernel.project_dir%/public/uploads/avatars'
Symfony Forms
Use DarvinStudio\DarvinFileBundle\Form\Type\FileType for form integration:
$builder->add('file', FileType::class, [
'label' => 'Upload File',
'allowed_types' => ['pdf|jpg|png'],
'max_size' => '5M',
]);
Event Listeners
Subscribe to darvin.file.pre_upload and darvin.file.post_upload events for custom logic:
// src/EventListener/CustomFileListener.php
public function onPreUpload(PreUploadEvent $event) {
if (!$event->isValid()) {
$event->setError('Custom validation failed.');
}
}
API Responses Return structured responses for uploads:
return $this->json([
'success' => true,
'file' => [
'name' => $result['filename'],
'url' => $fileManager->getUrl($result['filename'], 'user_uploads'),
],
]);
Outdated Package
Config Overrides
public/uploads as the base directory. Override carefully to avoid permission issues:
darvin_file:
base_directory: '%kernel.project_dir%/var/uploads'
File Validation
allowed_types) are case-sensitive by default. Normalize extensions if needed:
$fileManager->upload($file, 'directory', ['allowed_types' => ['jpg', 'jpeg']]);
Symlink Risks
base_directory unless explicitly configured, as the bundle may not handle them gracefully.Upload Failures
Check darvin.file.pre_upload event errors or log the FileManager output:
$result = $fileManager->upload($file, 'directory', ['log_errors' => true]);
Permission Issues
Ensure the web server user (e.g., www-data) has write permissions:
chmod -R 775 %kernel.project_dir%/public/uploads
chown -R www-data:www-data %kernel.project_dir%/public/uploads
Custom Storage
Extend DarvinStudio\DarvinFileBundle\Storage\StorageInterface for S3/Cloud storage:
class CustomStorage implements StorageInterface {
public function save(File $file, string $directory): string {
// Implement custom logic (e.g., AWS S3 upload)
}
}
Register the service in services.yaml:
DarvinStudio\DarvinFileBundle\Storage\StorageInterface: '@custom_storage'
File Processing
Hook into darvin.file.post_upload to process files (e.g., generate thumbnails):
public function onPostUpload(PostUploadEvent $event) {
$filePath = $event->getFilePath();
// Run FFmpeg/Imagick here
}
Dynamic Directories Use a callback in config to generate directory paths dynamically:
darvin_file:
directories:
dynamic_dir: '%kernel.project_dir%/public/uploads/%user_id%'
Then resolve %user_id% via a compiler pass or runtime logic.
darvin.file.pre_upload event to validate chunks before finalizing.FileManager calls:
$url = $cache->get('file_url_' . $filename, function() use ($fileManager) {
return $fileManager->getUrl($filename, 'directory');
});
How can I help you explore Laravel packages today?