livewire-filemanager/filemanager
Livewire-powered file manager for Laravel: drag & drop uploads, search, folders, dark mode, multi-language UI, and API endpoints. Integrates with Spatie Media Library for media handling and thumbnails. PHP 8.2+.
Installation:
composer require livewire-filemanager/filemanager
php artisan vendor:publish --tag=livewire-filemanager-migrations
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"
php artisan migrate
Include Component: Add to your Blade template:
@filemanagerStyles
<x-livewire-filemanager />
@filemanagerScripts
Tailwind Configuration (for production):
Update tailwind.config.js:
module.exports = {
content: [
'./resources/**/*.blade.php',
'./vendor/livewire-filemanager/filemanager/resources/views/**/*.blade.php',
],
}
First Use Case:
File Uploads:
MediaLibrary for storage (e.g., S3, local).// In a Livewire component
public function uploadFiles()
{
$this->validate(['files' => 'required|array']);
foreach ($this->files as $file) {
$this->storeMedia($file); // Uses Spatie's MediaLibrary
}
}
Folder Management:
// API Example (POST /api/filemanager/v1/folders)
{
"name": "projects",
"parent_id": null // Root folder
}
use LivewireFilemanager\Filemanager\Models\Folder;
$folder = Folder::with('children')->find(1);
File Access:
Route::get('{path}', [FileController::class, 'show'])
->where('path', '.*')
->name('assets.show');
API Integration:
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('folders', FolderController::class);
});
axios.post('/api/filemanager/v1/files', {
file: fileInput.files[0],
folder_id: 1
}, {
headers: { 'Authorization': `Bearer ${userToken}` }
});
Livewire Component Customization:
<x-livewire-filemanager
:allowed-file-types="['jpg', 'png', 'pdf']"
:max-file-size="5" // MB
/>
resources/views/vendor/livewire-filemanager/filemanager.blade.php).Queue Thumbnails:
QUEUE_CONNECTION in .env for async thumbnail generation:
QUEUE_CONNECTION=database
php artisan queue:work
ACL Setup:
php artisan vendor:publish --tag=livewire-filemanager-config
Update livewire-filemanager.php:
'acl_enabled' => true,
use LivewireFilemanager\Filemanager\Traits\HasMediaOwner;
class User extends Authenticatable {
use HasMediaOwner;
}
Multilingual Support:
app()->setLocale('es'); // Spanish
resources/lang/vendor/livewire-filemanager.Dark Mode:
'default_dark_mode' => true,
Testing:
$response = $this->actingAs($user)
->postJson('/api/filemanager/v1/files', [
'file' => $file,
'folder_id' => 1
]);
HTTPS Requirement:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
// config/trustedproxies.php
'proxies' => '127.0.0.1',
Queue Delays:
QUEUE_CONNECTION=database. Monitor workers:
php artisan queue:failed-table
File Permissions:
chmod -R 775 storage/app/public
API Authentication:
php artisan sanctum:install
Tailwind CDN in Production:
@filemanagerStyles with local Tailwind in app.blade.php:
<link href="{{ mix('css/app.css') }}" rel="stylesheet">
Logs:
'logging' => true,
in config/medialibrary.php.Livewire Errors:
@push('scripts')
@filemanagerScripts
@endpush
API Issues:
Route::middleware('auth:sanctum')->group(function () {
// API routes
});
$response = Http::withToken($user->createToken('test')->plainTextToken())
->post('/api/filemanager/v1/files', ['file' => $file]);
Custom Storage:
Media model to support custom drivers:
class CustomMedia extends Media {
public function registerConversions(ConversionManager $manager)
{
$manager->addConversion('custom_thumb')
->width(200)
->height(200);
}
}
Event Listeners:
use LivewireFilemanager\Filemanager\Events\FileUploaded;
FileUploaded::listen(function ($event) {
Log::info("File uploaded: {$event->file->name}");
});
UI Customization:
cp -r vendor/livewire-filemanager/filemanager/resources/views/vendor/livewire-filemanager resources/views/vendor/
filemanager.blade.php to add buttons or fields.Validation Rules:
use LivewireFilemanager\Filemanager\Rules\FileType;
$rules = [
'files' => ['required', 'array', new FileType(['jpg', 'png'])],
];
Dark Mode Toggle:
<button x-on:click="darkMode = !darkMode">
Toggle Dark Mode
</button>
Update filemanager.blade.php to respect darkMode state.Folder Model:
Folder model uses fillable = ['name', 'path', 'parent_id']. Add custom fields via:
protected $fillable = ['name', 'path', 'parent_id', 'custom_field'];
Media Model:
config('medialibrary.media_model') points to LivewireFilemanager\Filemanager\Models\Media.Queue Workers:
dispatchSync by default. For production, set:
'thumbnail_dispatch_sync' => false,
in livewire-filemanager.php.Public URL Route:
assets.show route conflicts with Laravel’s default routes. Use a namespace:
Route::prefix('fm')->name('fm.')->group(function ()
How can I help you explore Laravel packages today?