shahriar / laravel-filemanager
Project-scoped Laravel file manager: no storage:link, folders, password-protected files, Tailwind 4 UI.
Package info
github.com/apachish/laravel-filemanager
Language:Blade
pkg:composer/shahriar/laravel-filemanager
Requires
- php: ^8.2
- illuminate/support: ^11.0|^12.0|^13.0
- livewire/livewire: ^3.5|^4.0
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
فایلمنیجر پروژهمحور لاراول (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 خودکار.