connectholland/file-upload-bundle
Installation
composer require connectholland/file-upload-bundle
Enable in AppKernel.php:
new ConnectHolland\FileUploadBundle(),
Configure Storage Path
Add to config.yml:
file_upload:
path: "%kernel.root_dir%/../../uploads/%kernel.environment%"
Ensure the directory exists and is writable.
First Use Case: Basic File Upload
UploadObjectInterface (or use UploadTrait):
use ConnectHolland\FileUploadBundle\Model\UploadTrait;
class Product
{
use UploadTrait;
}
$builder->add('fileUpload', FileUploadType::class);
Entity Integration
UploadTrait for boilerplate methods (getFileUpload, setFileUpload, getFilePath, etc.).getFileUpload to getImageUpload via trait aliasing).Form Handling
FileUploadType for file fields in forms:
$builder->add('document', FileUploadType::class, [
'label' => 'Upload Document',
'required' => false,
'allowed_mime_types' => ['application/pdf'],
'max_size' => '10M',
]);
File constraint).File Management
prePersist/preUpdate in your entity to delete old files:
public function preUpdate()
{
if ($this->fileUpload && $this->fileUpload->getFilePath()) {
$this->fileUpload->deleteFile();
}
}
$entity->getFilePath() to retrieve the stored file path.Batch Processing
foreach ($products as $product) {
$form->submit($product);
if ($form->isValid()) {
$product->getFileUpload()->upload();
}
}
Custom Storage
FileUpload class or using a custom service.Directory Permissions
file_upload.path directory is writable by the web server user.Permission denied errors.File Overwriting
FileUpload class to append hashes or timestamps:
$this->fileUpload->setFileName(uniqid().'_'.$this->fileUpload->getFileName());
Entity Lifecycle Hooks
deleteFile() in preUpdate/preRemove can leave orphaned files.$entity->getFileUpload()->deleteFile(); // Force delete for testing.
Symfony 3+ Compatibility
Form Validation
$builder->add('fileUpload', FileUploadType::class, [
'constraints' => [
new File(['maxSize' => '1024k']),
new File(['mimeTypes' => ['image/jpeg']]),
],
]);
Configuration Flexibility
%kernel.environment% in config.yml) to separate dev/staging/prod uploads.Custom File Upload Class
ConnectHolland\FileUploadBundle\Model\FileUpload to add logic (e.g., auto-resize images):
class CustomFileUpload extends FileUpload
{
public function upload()
{
$this->resizeImage(); // Custom logic
parent::upload();
}
}
use AppBundle\Model\CustomFileUpload;
class Product
{
private $fileUpload;
public function getFileUpload()
{
return $this->fileUpload;
}
public function setFileUpload(CustomFileUpload $fileUpload)
{
$this->fileUpload = $fileUpload;
}
}
Debugging
$logger->info('File uploaded to: '.$entity->getFilePath());
Security
file_upload:
path: "%kernel.root_dir%/../../uploads/%kernel.environment%"
allowed_extensions: [jpg, png, pdf] # Optional: Filter extensions.
File validator to enforce security constraints.Testing
$file = new UploadedFile(__DIR__.'/fixtures/test.jpg', 'test.jpg');
$form->submit(['fileUpload' => $file]);
How can I help you explore Laravel packages today?