rahulhaque/laravel-filepond
Laravel backend for FilePond uploads: manages temporary storage, validation and cleanup. Supports single/multiple uploads, chunked and resumable uploads, AWS S3 multipart, process/patch/head/revert/restore endpoints, metadata plugin, and Spatie Media Library integration.
Installation
composer require rahulhaque/laravel-filepond
php artisan vendor:publish --provider="RahulHaque\Filepond\FilepondServiceProvider"
php artisan migrate
Frontend Setup Include FilePond JS/CSS and configure the server endpoint:
FilePond.setOptions({
server: {
url: "{{ config('filepond.server.url') }}",
headers: { 'X-CSRF-TOKEN': "{{ csrf_token() }}" }
}
});
FilePond.create(document.querySelector('input[type="file"]'));
First Upload
<form method="POST" action="{{ route('upload') }}">
@csrf
<input type="file" name="files[]" multiple>
<button type="submit">Upload</button>
</form>
Backend Processing
use RahulHaque\Filepond\Facades\Filepond;
public function upload(Request $request) {
$files = Filepond::field($request->files)->moveTo('uploads/');
// $files now contains array of moved file info
}
config/filepond.php (temporary storage, validation rules, disk settings)Rule::filepond() for custom validation/filepond/process (handles uploads), /filepond/patch, /filepond/head, etc.Temporary Storage
storage/temp/filepond (configurable) during upload.Filepond::field()->getFile() to inspect metadata before moving.Validation
validation_rules in config/filepond.php (e.g., ['max:10M', 'mimes:jpg,png']).Rule::filepond() in FormRequests or controllers:
$this->validate($request, [
'files.*' => Rule::filepond(['max:5M', 'image'])
]);
Permanent Storage
$fileInfo = Filepond::field($request->file)->moveTo('avatars/user1.jpg');
$fileInfos = Filepond::field($request->files)->moveTo('gallery/');
// Files auto-named as `gallery-1.jpg`, `gallery-2.jpg`, etc.
Chunked Uploads
FilePond.create(input, { chunkUploads: true });
chunk_size in config/filepond.php (default: 5MB).AWS S3 Integration
temp_disk to s3 in config (files upload directly to S3).moveTo('s3:bucket-name/path') to specify S3 paths.$file = Filepond::field($request->file)->moveTo('media/');
$model->addMedia($file['url'])->toMediaCollection('images');
return response()->json($fileInfos);
$fileInfo = Filepond::field($request->file)
->moveTo(fn($file) => "users/{auth()->id()}/{$file['basename']}");
| Scenario | Implementation Pattern |
|---|---|
| User Avatars | moveTo("avatars/{userId}.{extension}") |
| Product Galleries | moveTo("products/{productId}/") + auto-naming |
| Document Uploads | copyTo("documents/") + manual processing |
| Video Thumbnails | Chunked uploads + moveTo("videos/{videoId}/") |
Third-Party Storage Quirks
Rule::filepond() only with local temp_disk. For cloud storage, validate client-side or use API constraints.Permission Errors
filepond:clear doesn’t work.chmod -R 775 storage/temp/filepond
chown -R www-data:www-data storage/temp/filepond # Adjust user as needed
CSRF Token Mismatch
X-CSRF-TOKEN header not set correctly.csrf_token() matches your frontend framework (e.g., Inertia/Vue may need laravel.csrfToken).Large File Timeouts
max_execution_time and memory_limit in php.ini.Soft Delete Confusion
moveTo() respects soft_delete config (default: true).soft_delete: false in config if you want immediate deletion.ls -la storage/temp/filepond
config/filepond.php:
'log_uploads' => true, // Logs to storage/logs/filepond.log
$file = Filepond::find($fileId);
dd($file->file); // Inspect stored metadata
Custom Validation Rules
Extend the Rule::filepond() validator:
use RahulHaque\Filepond\Rules\Filepond;
$validator = Validator::make($request->all(), [
'file' => ['required', new Filepond(['custom_rule' => true])]
]);
Override Storage Logic
Bind a custom filesystem to the Filepond facade:
Filepond::setDisk('s3-custom');
Hook into Upload Events Publish the event listeners:
php artisan vendor:publish --tag=filepond-events
Then extend FilepondUploaded event in app/Listeners.
Custom Filepond Model
Extend the Filepond model to add fields:
php artisan make:model FilepondExtension --extend=RahulHaque\Filepond\Models\Filepond
Add fields like user_id or metadata.
moveTo() with a closure to generate unique names:
$fileInfo = Filepond::field($request->file)
->moveTo(fn($file) => "uploads/{Str::uuid()}.{$file['extension']}");
false to moveTo()’s second parameter:
$fileInfo = Filepond::field($request->file)->moveTo('uploads/', false);
app/Console/Kernel.php:
$schedule->command('filepond:clear')->daily();
filepond-plugin-file-metadata with the Filepond facade:
$metadata = Filepond::field($request->file)->getMetadata();
How can I help you explore Laravel packages today?