Installation:
composer require dasundev/livewire-dropzone
Publish the config (optional):
php artisan vendor:publish --provider="Dasun\LivewireDropzone\LivewireDropzoneServiceProvider"
First Use Case: Add the component to a Livewire blade view:
<livewire:dropzone
upload-url="{{ route('upload') }}"
max-files="5"
accepted-files="image/*,application/pdf"
@uploaded="uploaded($event)"
/>
Define the upload route in routes/web.php:
Route::post('/upload', [UploadController::class, 'store'])->name('upload');
Basic Controller Logic:
use Dasun\LivewireDropzone\DropzoneUploadedFile;
public function store()
{
$files = request()->file('files');
foreach ($files as $file) {
// Handle file (e.g., store in storage)
$path = $file->store('uploads');
}
return response()->json(['success' => true]);
}
Livewire Component Integration:
use Livewire\Component;
use Dasun\LivewireDropzone\DropzoneUploadedFile;
public function uploaded($event)
{
$files = $event['files'];
foreach ($files as $file) {
$this->handleFile($file); // Custom logic
}
}
<livewire:dropzone
upload-url="{{ route('upload') }}"
@uploaded="handleUpload($event)"
/>
public function handleUpload($event)
{
$files = $event['files'];
foreach ($files as $file) {
$this->storeFile($file);
}
}
config/livewire-dropzone.php:
'chunking' => [
'enabled' => true,
'chunk_size' => 5 * 1024 * 1024, // 5MB
],
<livewire:dropzone
upload-url="{{ route('upload.chunk') }}"
chunking="true"
/>
@thumbnail event to generate thumbnails on upload:
<livewire:dropzone
@thumbnail="generateThumbnail($event)"
/>
public function generateThumbnail($event)
{
$file = $event['file'];
$thumbnail = \Intervention\Image\Facades\Image::make($file->getRealPath())
->resize(200, 200)
->encode();
$this->saveThumbnail($thumbnail, $file->getClientOriginalName());
}
public function storeFile(DropzoneUploadedFile $file)
{
$path = $file->store('s3-uploads', 's3');
// Log or process further
}
public function handleUpload($event)
{
foreach ($event['files'] as $file) {
$this->validateFile($file);
$this->storeFile($file);
}
}
protected function validateFile(DropzoneUploadedFile $file)
{
$this->validate([
'file' => 'required|mimes:jpg,png,pdf|max:10240',
], [], [
'file' => $file->getClientOriginalName(),
]);
}
@upload-progress event:
<livewire:dropzone
@upload-progress="updateProgress($event)"
/>
public $progress = 0;
public function updateProgress($event)
{
$this->progress = $event['progress'];
}
<progress value="{{ $progress }}" max="100"></progress>
// For S3, add this to your bucket policy:
{
"AllowedHeaders": ["Authorization"],
"AllowedMethods": ["PUT", "POST", "DELETE"],
"AllowedOrigins": ["https://yourdomain.com"],
}
upload_max_filesize and post_max_size may block large uploads. Adjust in php.ini:
upload_max_filesize = 20M
post_max_size = 25M
max_execution_time is sufficient.upload-started → upload-progress → thumbnail (if enabled) → uploaded.
Use this to chain logic (e.g., show progress bar before uploaded).wire:ignore to prevent Livewire from re-rendering it:
<div wire:ignore>
<livewire:dropzone ... />
</div>
upload-url) supports chunked uploads. For Laravel, use:
public function chunkStore()
{
$chunk = request()->file('chunk');
$identifier = request()->input('identifier');
$totalChunks = request()->input('totalChunks');
$chunkIndex = request()->input('chunkIndex');
// Logic to handle chunk (e.g., save to temporary storage)
}
unique() or custom naming in storage:
public function storeFile(DropzoneUploadedFile $file)
{
$path = $file->storeAs(
'uploads',
Str::uuid() . '.' . $file->getClientOriginalExtension()
);
}
class BaseDropzone extends Component
{
public function handleUpload($event)
{
foreach ($event['files'] as $file) {
$this->validateFile($file);
$this->storeFile($file);
}
}
protected function validateFile(DropzoneUploadedFile $file) { /* ... */ }
protected function storeFile(DropzoneUploadedFile $file) { /* ... */ }
}
Extend it for specific use cases:
class ProfileAvatarDropzone extends BaseDropzone { /* ... */ }
<livewire:dropzone
:upload-url="$uploadUrl"
:max-files="$maxFiles"
:accepted-files="$allowedTypes"
/>
<livewire:dropzone
:messages="__('livewire-dropzone::messages')"
/>
Publish and customize the language file:
php artisan vendor:publish --tag=livewire-dropzone-lang
UploadedFile facade:
public function test_upload()
{
$file = UploadedFile::fake()->image('test.jpg');
$this->call('POST', '/upload', [
'files' => [$file],
])->assertOk();
}
<livewire:dropzone
thumbnail-method="isImage"
/>
Define isImage in your Livewire component:
public function isImage(DropzoneUploadedFile $file)
{
return in_array($file->getClientOriginalExtension(), ['jpg', 'png', 'gif']);
}
@removed event to handle file deletions:
<livewire:dropzone
@removed="removeFile($event)"
How can I help you explore Laravel packages today?