composer require netipar/laravel-chunky
php artisan vendor:publish --tag=chunky-config
php artisan migrate
npm install @netipar/chunky-vue3
<script setup>
import { useChunkUpload } from '@netipar/chunky-vue3';
const { upload, progress, isUploading } = useChunkUpload();
</script>
<input type="file" @change="(e) => upload(e.target.files[0])" />
Upload a large file (e.g., 100MB) with progress tracking:
<script setup>
const { upload, progress, isComplete, error } = useChunkUpload();
function handleUpload(e) {
upload(e.target.files[0]);
}
</script>
<template>
<input type="file" @change="handleUpload" />
<progress v-if="isUploading" :value="progress" max="100" />
<p v-if="error">{{ error }}</p>
</template>
Frontend:
useChunkUpload, useBatchUpload).chunkSize prop.onProgress, onComplete, onError.Backend:
UploadCompleted) in EventServiceProvider.AssembleFileJob (run on queue).<livewire:chunky-upload /> with slots for custom UI.useBatchUpload for multiple files with shared progress.Authorizer to override default ownership checks.config/chunky.php for Datadog/Prometheus.// app/Listeners/ProcessUploadedFile.php
public function handle(UploadCompleted $event) {
$filePath = $event->finalPath;
// Process file (e.g., generate thumbnail, store metadata)
}
<script setup>
const { upload } = useChunkUpload({
maxConcurrent: 4, // Parallel chunks
autoRetry: true, // Retry failed chunks
maxRetries: 3, // Max retries
chunkSize: 10 * 1024 * 1024, // 10MB chunks
context: 'user_avatars', // Optional context for validation
});
</script>
Queue Worker Required:
AssembleFileJob must run on a queue (not sync). Use queue:work or a supervisor.storage/app/chunky/uploads/.Lock Driver:
array or file cache drivers for chunky.lock_driver. Use Redis/Memcached/DB.CSRF Token:
XSRF-TOKEN cookie. If using custom headers, set via setDefaults():
import { setDefaults } from '@netipar/chunky-core';
setDefaults({ headers: { 'X-CSRF-TOKEN': 'custom-token' } });
Staging Directory:
/tmp space) need chunky.staging_directory configured.Broadcasting:
CHUNKY_BROADCASTING=true + Laravel Echo + WebSocket server.php artisan chunky:status {uploadId}
php artisan chunky:cleanup
chunky.log_level = debug in config.Custom Storage:
Override ChunkStorage to use S3/Cloudflare directly:
// config/chunky.php
'storage' => \App\Services\CustomChunkStorage::class,
Validation:
Extend UploadValidator to reject files by MIME type or size:
public function validate(array $data): void {
parent::validate($data);
if ($data['size'] > 500 * 1024 * 1024) { // 500MB
throw new ValidationException('File too large.');
}
}
Frontend Theming:
Override default styles by targeting .chunky-upload-progress or .chunky-upload-button.
pause()/resume() in UI.useBatchUpload:
<div v-for="file in completedFiles" :key="file.name">
{{ file.name }} ({{ file.size }})
</div>
chunky-upload-completed in parent components:
#[On('chunky-upload-completed')]
public function handleUpload(array $data) {
$this->dispatch('upload-success', data: $data);
}
chunky.routes.middleware.How can I help you explore Laravel packages today?