laravel-filemanager maintained by shahriar
shahriar/laravel-filemanager
فایلمنیجر پروژهمحور لاراول (Livewire 3/4) — بدون storage:link، نمایش فایل از طریق route، پوشه، انتقال، رمز نمایش، Tailwind 4، دارک/لایت، RTL/LTR، ریسپانسیو.
نصب
# 1) پوشه را در packages/shahriar/filemanager کپی کنید، سپس در composer.json پروژه:
# "repositories": [{"type": "path", "url": "packages/shahriar/filemanager"}]
composer require shahriar/laravel-filemanager:@dev
php artisan migrate
php artisan vendor:publish --tag=filemanager-config # اختیاری
استفاده
- پنل:
/file-manager/{project_id} - نمایش فایل:
/display-file/{project_id}/{path}یاfm_url($projectId, 'folder/a.jpg') - مسیر ذخیره:
storage/app/public/projects/{project_id}/...(همه کاربران یک پروژه، فایلهای مشترک دارند)
<img src="{{ fm_url($project->id, 'banners/hero.webp') }}">
دسترسی
// AppServiceProvider::boot()
Gate::define('manage-files', fn ($user, $projectId) => $user->projects()->whereKey($projectId)->exists());
// config/filemanager.php → 'gate' => 'manage-files'
رمز نمایش
از منوی ⋮ هر فایل/پوشه → «رمز عبور». رمز پوشه روی همه زیرمجموعهها اعمال میشود.
بازدیدکننده در /display-file/... صفحه ورود رمز را میبیند؛ پنل (کاربر مجاز) بدون رمز میبیند.
Livewire
- پنل یک کامپوننت Livewire است:
@livewire('filemanager-panel', ['project' => $id])(داخل لایوت خودتان هم قابل استفاده است). - سقف آپلود Livewire جداست؛ در
config/livewire.php:'temporary_file_upload' => ['rules' => ['required', 'file', 'max:51200']]وupload_max_filesize/post_max_sizeدر php.ini. - Alpine همراه Livewire است؛ جداگانه import نکنید.
- دسترسی در هر درخواست Livewire هم چک میشود (
gateوauth).
زبان / جهت
- سوئیچ
فارسی | Englishدر هدر پنل:fa→ RTL،en→ LTR (جهت روی<html>و ریشه کامپوننت اعمال میشود). - انتخاب در session ذخیره میشود؛ زبانها در
config('filemanager.locales')و زبانهای RTL درrtl_locales. - بدون سوئیچ هم کار میکند:
app()->getLocale()اگر درlocalesباشد استفاده میشود.
داخل لایوت پنل خودتان
// routes/web.php
Route::get('/admin/files', fn () => view('admin.files', ['project' => currentProject()]))
->middleware('auth')->name('admin.files');
{{-- resources/views/admin/files.blade.php --}}
@extends('layouts.admin')
@section('content')
@livewire('filemanager-panel', ['project' => $project->id, 'embedded' => true])
@endsection
{{-- یا: <x-layouts.admin><livewire:filemanager-panel :project="$project->id" embedded /></x-layouts.admin> --}}
منو: <a href="{{ route('admin.files') }}">.
embedded: بدون سوئیچ تم/زبان (از پنل شما پیروی میکند)، هدر sticky نیست.
لایوت شما باید @livewireStyles / @livewireScripts، کلاس dark برای دارک، و در app.css:
@source "../../vendor/shahriar/laravel-filemanager/resources/views"; و [x-cloak]{display:none!important} داشته باشد.
انتخاب فایل داخل فرم (Picker)
{{-- فرم Blade معمولی --}}
<x-filemanager::picker name="cover" :project="$project->id" :value="$post->cover" accept="image" />
{{-- فرم Livewire --}}
<x-filemanager::picker :project="$project->id" accept="image" wire:model="cover" />
accept:image,video,audio,pdf,archive,file(خالی = همه).store="path"(پیشفرض، مسیر نسبی مثلbanners/a.webp) یاstore="url"(لینک کامل).- نمایش:
<img src="{{ fm_url($project->id, $post->cover) }}"> - پشت صحنه یک iframe از
/file-manager/{project}/pickerباز میشود (همیشه با لایوت خود پکیج، مستقل ازlayoutکانفیگ) و باpostMessage(همان origin) انتخاب را برمیگرداند. هدرX-Frame-OptionsبایدSAMEORIGINباشد. - ولیدیشن سمت سرور:
app(FileManagerService::class)->isFile($projectId, $path).
اگر قبلاً
vendor:publish --tag=filemanager-viewsزدهاید، پوشهresources/views/vendor/filemanagerنسخه قدیمی را override میکند؛ آن را حذف کنید (یا دوباره publish با--force).
Tailwind 4
- پیشفرض (
cdn => true): Tailwind browser + Alpine از CDN؛ نیازی به build نیست. - با build خودتان:
'cdn' => falseو درapp.css:
@import "tailwindcss";
@source "../../vendor/shahriar/laravel-filemanager/resources/views";
@custom-variant dark (&:where(.dark, .dark *));
و @livewireStyles / @livewireScripts را در لایوت داشته باشید.
- لایوت خودتان:
'layout' => 'layouts.admin'(باید@yield('content')داشته باشد).
نکات
- فقط دیسکهای driver=local (
public,local) — انتقال پوشه باrenameانجام میشود. - پسوندهای خطرناک در
blocked_extensionsمسدودند. SVG با CSP sandbox سرو میشود. - زبان:
app()->setLocale('fa')→ RTL خودکار.