Search by

shahriar / laravel-filemanager

apachish

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

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-10-10 21:56 UTC

This package is auto-updated.

Last update: 2026-10-10 22:01:20 UTC


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 خودکار.