alphalemon/al-valum-uploader-bundle
Installation:
git clone git://github.com/alphalemon/AlValumUploaderBundle.git vendor/bundles/AlphaLemon/AlValumUploaderBundle
Update app/autoload.php to register the namespace:
$loader->registerNamespaces(array(
'AlphaLemon' => __DIR__.'/../vendor/bundles',
));
Register Bundle (in AppKernel.php):
public function registerBundles()
{
$bundles = [
// ...
new AlphaLemon\AlValumUploaderBundle\AlValumUploaderBundle(),
];
}
Configure Assetic (in config.yml):
assetic:
filters:
yui_js:
jar: %kernel.root_dir%/Resources/java/yuicompressor.jar
yui_css:
jar: %kernel.root_dir%/Resources/java/yuicompressor.jar
Download yuicompressor.jar from YUI Compressor and place it in app/Resources/java/.
Install Assets:
php app/console assets:install web --symlink
Integrate the uploader into a Twig template:
{% block stylesheets %}
{{ parent() }}
{{ asset('bundles/alvalumuploader/css/valum.css') }}
{% endblock %}
{% block javascripts %}
{{ parent() }}
{{ asset('bundles/alvalumuploader/js/valum.js') }}
<script>
$(document).ready(function() {
$('#file-uploader').valumUploader({
uploadUrl: '{{ path('upload_endpoint') }}',
allowedExtensions: ['jpg', 'png', 'gif'],
maxFileSize: 5242880 // 5MB
});
});
</script>
{% endblock %}
Create a controller endpoint (src/AlphaLemon/AlValumUploaderBundle/Controller/UploadController.php):
namespace AlphaLemon\AlValumUploaderBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class UploadController extends Controller
{
public function uploadAction(Request $request)
{
$file = $request->files->get('file');
$uploadDir = $this->get('kernel')->getRootDir().'/../web/uploads/';
$file->move($uploadDir, $file->getClientOriginalName());
return new Response(json_encode([
'success' => true,
'file' => $file->getClientOriginalName()
]));
}
}
Route it in routing.yml:
al_valum_uploader_upload:
path: /upload
defaults: { _controller: AlphaLemonAlValumUploaderBundle:Upload:upload }
Basic File Upload:
<div id="file-uploader" data-upload-url="{{ path('upload_endpoint') }}"></div>
Dynamic Configuration:
$('#file-uploader').valumUploader({
uploadUrl: '/dynamic-upload-endpoint',
allowedExtensions: ['pdf', 'docx'],
maxFileSize: 10485760, // 10MB
onComplete: function(response) {
console.log('Uploaded:', response);
}
});
Server-Side Handling:
UploadController to handle file processing (e.g., validation, storage, metadata extraction).public function uploadAction(Request $request)
{
$file = $request->files->get('file');
$allowedExtensions = ['jpg', 'png', 'gif'];
$maxSize = 5 * 1024 * 1024; // 5MB
if (!$file || !in_array(strtolower($file->getClientOriginalExtension()), $allowedExtensions)) {
return new Response(json_encode(['success' => false, 'error' => 'Invalid file type']), 400);
}
if ($file->getSize() > $maxSize) {
return new Response(json_encode(['success' => false, 'error' => 'File too large']), 400);
}
// Proceed with upload logic...
}
Chunked Uploads:
$('#file-uploader').valumUploader({
chunkSize: 1024 * 1024, // 1MB chunks
uploadUrl: '/chunked-upload'
});
league/flysystem to handle chunked uploads.Integration with Doctrine:
$uploadedFile = new UploadedFile();
$uploadedFile->setName($file->getClientOriginalName());
$uploadedFile->setPath($file->getPath());
$uploadedFile->setSize($file->getSize());
$uploadedFile->setMimeType($file->getMimeType());
$uploadedFile->setUser($this->getUser());
$em = $this->getDoctrine()->getManager();
$em->persist($uploadedFile);
$em->flush();
Assetic Integration:
Ensure yuicompressor.jar is correctly configured in config.yml for minification.
Example Assetic config for Valum:
assetic:
bundles: [AlphaLemonAlValumUploaderBundle]
assets:
valum_js:
inputs:
- '@AlphaLemonAlValumUploaderBundle/Resources/public/js/valum.js'
filters: [yui_js]
valum_css:
inputs:
- '@AlphaLemonAlValumUploaderBundle/Resources/public/css/valum.css'
filters: [yui_css]
Custom Templates: Override Valum templates by extending the bundle’s resources:
{% extends 'AlphaLemonAlValumUploaderBundle::default/template.html.twig' %}
{% block valum_template %}
{{ parent() }}
<!-- Custom HTML/JS -->
{% endblock %}
Event Listeners: Dispatch events for upload progress or completion using Symfony’s event system:
// In services.yml
services:
al_valum_uploader.listener:
class: AppBundle\EventListener\UploadListener
tags:
- { name: kernel.event_listener, event: al_valum_uploader.upload_complete, method: onUploadComplete }
Missing yuicompressor.jar:
yuicompressor.jar and place it in app/Resources/java/. Ensure the path in config.yml is correct.CORS Issues:
File Size Limits:
upload_max_filesize and post_max_size in php.ini. For chunked uploads, ensure the server can handle partial requests.Bundle Not Loading:
AppKernel.php and the namespace is included in autoload.php.Symfony 2.1 Dependency:
symfony/symfony:2.1.*) or fork the bundle for updates.Check Valum Console Logs:
Open browser dev tools (F12) to inspect Valum’s AJAX requests and responses. Look for errors in the Console or Network tabs.
Enable Debug Mode:
Set APP_DEBUG=true in .env to get detailed error messages for failed uploads or asset loading.
Validate JavaScript: Ensure jQuery is loaded before Valum’s script:
{{ asset('bundles/jquery/jquery.js') }}
{{ asset('bundles/alvalumuploader/js/valum.js') }}
How can I help you explore Laravel packages today?