سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
Storage در Laravel چیست؟ آموزش کامل مدیریت فایل در لاراول

Storage در Laravel چیست؟ آموزش کامل مدیریت فایل در لاراول

ممدیر کل سیستم ۱۵ مهر ۱۴۰۵ ۱۸ دقیقه مطالعه ۲ بازدید
Storage در Laravel چیست؟ آموزش کامل مدیریت فایل در لاراول

در بسیاری از پروژه‌های Laravel لازم است فایل‌هایی مانند تصویر محصول، تصویر پروفایل، فایل PDF، مدارک کاربران، فایل‌های آموزشی یا فایل‌های مربوط به سفارش‌ها را ذخیره و مدیریت کنیم.

در نگاه اول ممکن است ذخیره کردن یک فایل روی سرور کار ساده‌ای به نظر برسد؛ اما وقتی پروژه بزرگ‌تر می‌شود، موضوعاتی مانند محل ذخیره فایل، فایل‌های عمومی و خصوصی، نام‌گذاری فایل‌ها، حذف فایل‌های قدیمی، جابه‌جایی فایل‌ها و حتی استفاده از فضای ذخیره‌سازی خارجی اهمیت زیادی پیدا می‌کنند.

Laravel برای حل این مسائل یک سیستم قدرتمند به نام Filesystem در اختیار توسعه‌دهندگان قرار می‌دهد.

با استفاده از Storage در Laravel می‌توانیم بدون وابستگی شدید به مسیرهای فیزیکی سرور، فایل‌ها را ذخیره، دریافت، حذف، کپی و جابه‌جا کنیم.

در این مقاله با مفهوم Storage، Disk، Filesystem، Storage Facade، public و local، دستور storage:link و روش‌های مدیریت فایل در Laravel آشنا می‌شویم.


Storage در Laravel چیست؟

Storage در Laravel مجموعه امکاناتی است که برای مدیریت فایل‌ها و محل ذخیره‌سازی آن‌ها در اختیار برنامه قرار دارد.

به جای اینکه در تمام قسمت‌های برنامه مستقیماً با مسیرهای فیزیکی سرور کار کنیم، می‌توانیم از API مربوط به Storage استفاده کنیم.

برای مثال:


use Illuminate\Support\Facades\Storage;



Storage::put('example.txt', 'Hello Laravel');

یا:


Storage::delete('example.txt');

این روش باعث می‌شود منطق مدیریت فایل از مسیرهای فیزیکی سیستم‌عامل جدا شود.


Filesystem در Laravel چیست؟

Laravel برای مدیریت فایل‌ها از یک abstraction یا لایه انتزاعی به نام Filesystem استفاده می‌کند.

این موضوع اهمیت زیادی دارد؛ زیرا برنامه شما نباید برای هر عملیات فایل به مسیرهای فیزیکی وابسته باشد.

برای مثال ممکن است امروز فایل‌ها را روی سرور محلی ذخیره کنید:


Local Server

اما در آینده بخواهید آن‌ها را به یک فضای ذخیره‌سازی ابری منتقل کنید.

اگر تمام کد برنامه مستقیماً به مسیرهای سرور وابسته باشد، انجام این تغییر دشوار می‌شود.

Storage این وابستگی را کاهش می‌دهد.


# Disk در Laravel چیست؟

یکی از مهم‌ترین مفاهیم Storage در Laravel، Disk است.

Disk مشخص می‌کند فایل‌ها در چه نوع Storage و چه محل یا سرویسی ذخیره شوند.

برای مثال یک Disk می‌تواند برای فایل‌های محلی باشد و Disk دیگری برای فایل‌های عمومی.

تنظیمات Diskها معمولاً در فایل زیر قرار دارند:


config/filesystems.php

ساختار این فایل به صورت کلی شامل تنظیمات Filesystem و Diskهای مختلف است.


Disk پیش‌فرض در Laravel

Laravel یک Disk پیش‌فرض دارد که از طریق تنظیمات Filesystem مشخص می‌شود.

برای مثال می‌توانید Disk پیش‌فرض را در محیط پروژه کنترل کنید.

در .env معمولاً تنظیمی مانند این وجود دارد:


FILESYSTEM_DISK=local

در نتیجه زمانی که بدون تعیین Disk از Storage استفاده می‌کنید، عملیات روی Disk پیش‌فرض انجام می‌شود.

مثلاً:


Storage::put('test.txt', 'Hello');

از Disk پیش‌فرض استفاده می‌کند.


# Diskهای مهم Laravel

در یک پروژه معمولاً با Diskهایی مانند موارد زیر سروکار داریم:

  • local
  • public
  • Diskهای سفارشی
  • Storageهای ابری مانند S3

دو Disk مهم برای شروع کار، local و public هستند.


# Disk local در Laravel

Disk local معمولاً برای فایل‌هایی مناسب است که قرار نیست مستقیماً به صورت عمومی از طریق مرورگر قابل دسترسی باشند.

برای مثال:


Storage::disk('local')->put(

    'documents/example.txt',

    'Private document'

);

در این حالت فایل در Storage مربوط به Disk محلی ذخیره می‌شود.

این نوع Storage برای فایل‌های خصوصی مانند:

  • مدارک کاربران
  • فایل‌های داخلی سیستم
  • گزارش‌ها
  • فایل‌های پردازش‌شده
  • فایل‌های موقت

می‌تواند مناسب باشد.


# Disk public در Laravel

Disk public برای فایل‌هایی مناسب است که باید امکان دسترسی عمومی به آن‌ها وجود داشته باشد.

برای مثال:

  • تصاویر محصولات
  • تصاویر مقالات
  • تصاویر پروفایل عمومی
  • فایل‌های عمومی سایت

می‌توان فایل را روی Disk public ذخیره کرد:


Storage::disk('public')->put(

    'products/example.txt',

    'Product file'

);

اما ذخیره فایل روی Disk public به تنهایی به معنی قابل دسترس بودن مستقیم آن از طریق مرورگر نیست.

برای این کار باید لینک Storage ایجاد شود.


# storage:link در Laravel چیست؟

Laravel برای دسترسی عمومی به فایل‌های Disk public امکان ایجاد یک Symbolic Link را فراهم می‌کند.

برای ایجاد این لینک از دستور Artisan زیر استفاده کنید:


php artisan storage:link

بعد از اجرای این دستور، Laravel لینک موردنیاز را ایجاد می‌کند تا فایل‌های عمومی Storage از مسیر مناسب وب قابل دسترسی باشند.

به صورت مفهومی:


storage/app/public

        ↓

storage:link

        ↓

public/storage

بنابراین فایل‌هایی که در storage/app/public قرار گرفته‌اند می‌توانند از طریق مسیر عمومی مناسب در سایت ارائه شوند.


# چه زمانی باید از public و چه زمانی از local استفاده کنیم؟

این تصمیم به نوع فایل بستگی دارد.

نوع فایلDisk پیشنهادی
تصویر محصولpublic
تصویر مقالهpublic
آواتار عمومیpublic
فایل CSS یا Asset تولیدشدهبسته به معماری پروژه
مدارک هویتیlocal
قرارداد کاربرانlocal
فایل خصوصی سفارشlocal
گزارش داخلیlocal
فایل قابل دانلود عمومیpublic

اصل مهم این است:

> فایل‌هایی که نباید هر کاربری به آن‌ها دسترسی داشته باشد را به صورت عمومی ذخیره نکنید.


# استفاده از Storage Facade

برای کار با Storage معمولاً از Facade مربوط به آن استفاده می‌کنیم:


use Illuminate\Support\Facades\Storage;

بعد می‌توانیم عملیات مختلفی انجام دهیم.

برای مثال:


Storage::put('example.txt', 'Hello Laravel');

یا:


Storage::delete('example.txt');

یا:


Storage::exists('example.txt');

این روش بسیار تمیزتر از کار مستقیم با مسیرهای فیزیکی سرور است.


# ایجاد فایل با Storage::put

یکی از ساده‌ترین عملیات Storage، ایجاد یک فایل است.


Storage::put(

    'example.txt',

    'Hello Laravel'

);

در این مثال یک فایل به نام example.txt ایجاد می‌شود و متن مشخص‌شده در آن قرار می‌گیرد.

می‌توانیم مسیر پوشه را نیز مشخص کنیم:


Storage::put(

    'documents/example.txt',

    'Hello Laravel'

);

در این حالت فایل داخل پوشه documents قرار می‌گیرد.


# استفاده از Disk مشخص

اگر بخواهیم Disk مشخصی را انتخاب کنیم:


Storage::disk('public')->put(

    'documents/example.txt',

    'Hello Laravel'

);

یا:


Storage::disk('local')->put(

    'private/example.txt',

    'Private content'

);

این روش زمانی بسیار مفید است که پروژه چند نوع Storage داشته باشد.


# بررسی وجود فایل

گاهی لازم است قبل از انجام عملیات بررسی کنیم که فایل وجود دارد یا خیر.

برای این کار:


if (Storage::exists('example.txt')) {

    // فایل وجود دارد

}

برای Disk مشخص:


if (Storage::disk('public')->exists('example.txt')) {

    // فایل وجود دارد

}

این قابلیت برای عملیات‌هایی مانند حذف، جایگزینی یا دانلود فایل کاربرد زیادی دارد.


# دریافت محتوای فایل

اگر بخواهیم محتوای یک فایل متنی را دریافت کنیم:


$content = Storage::get('example.txt');

برای Disk مشخص:


$content = Storage::disk('local')->get(

    'example.txt'

);

این قابلیت بیشتر برای فایل‌هایی کاربرد دارد که برنامه نیاز دارد محتوای آن‌ها را بخواند.


# حذف فایل در Laravel

برای حذف فایل می‌توانیم از delete() استفاده کنیم:


Storage::delete('example.txt');

یا:


Storage::disk('public')->delete(

    'products/example.jpg'

);

می‌توان چند فایل را نیز برای حذف ارسال کرد:


Storage::delete([

    'example.txt',

    'example2.txt',

]);


# چرا حذف فایل‌های قدیمی مهم است؟

فرض کنید کاربر تصویر پروفایل خود را تغییر می‌دهد.

اگر تصویر قبلی را حذف نکنیم، با گذشت زمان تعداد زیادی فایل بدون استفاده روی سرور باقی می‌ماند.

مثلاً:


avatars/

├── old-avatar-1.jpg

├── old-avatar-2.jpg

├── old-avatar-3.jpg

├── old-avatar-4.jpg

└── current-avatar.jpg

در پروژه‌های کوچک شاید این موضوع در ابتدا قابل توجه نباشد، اما در یک سیستم بزرگ می‌تواند باعث مصرف بی‌دلیل فضای Storage شود.

بنابراین هنگام جایگزینی فایل، بهتر است در صورت نیاز فایل قبلی نیز حذف شود.


# جابه‌جایی فایل با move

برای انتقال فایل از یک مسیر به مسیر دیگر می‌توان از move() استفاده کرد:


Storage::move(

    'old/example.txt',

    'new/example.txt'

);

برای Disk مشخص:


Storage::disk('public')->move(

    'old/example.jpg',

    'products/example.jpg'

);

این قابلیت برای تغییر ساختار پوشه‌ها یا انتقال فایل‌های موقت به محل نهایی کاربرد دارد.


# کپی کردن فایل با copy

گاهی به جای انتقال، می‌خواهیم یک نسخه دیگر از فایل ایجاد کنیم.

برای این کار:


Storage::copy(

    'example.txt',

    'backup/example.txt'

);

در این حالت فایل اصلی باقی می‌ماند و نسخه دیگری در مسیر جدید ایجاد می‌شود.


# دریافت URL فایل

برای فایل‌هایی که روی Disk عمومی قرار دارند، می‌توان URL فایل را دریافت کرد.

مثلاً:


$url = Storage::url('products/example.jpg');

یا برای Disk مشخص:


$url = Storage::disk('public')->url(

    'products/example.jpg'

);

سپس می‌توان از آن برای نمایش تصویر استفاده کرد:


<img

    src="{{ Storage::disk('public')->url($product->image) }}"

    alt="{{ $product->name }}"

>


# نمایش تصویر ذخیره‌شده در Laravel

فرض کنید مسیر تصویر محصول در Database ذخیره شده است:


products/abc123.webp

می‌توانیم در Blade بنویسیم:


<img

    src="{{ Storage::disk('public')->url($product->image) }}"

    alt="{{ $product->name }}"

>

در این حالت برنامه URL مناسب فایل را تولید می‌کند.

این روش بهتر از آن است که در بخش‌های مختلف پروژه مسیرهای فیزیکی Storage را به صورت دستی بنویسیم.


# دریافت مسیر واقعی فایل

گاهی خود برنامه نیاز دارد مسیر فایل روی سیستم را بداند.

برای Diskهای محلی می‌توان از:


$path = Storage::path('example.txt');

یا:


$path = Storage::disk('public')->path(

    'products/example.jpg'

);

استفاده کرد.

این قابلیت در شرایطی کاربرد دارد که یک کتابخانه PHP یا ابزار پردازشی نیاز به مسیر فیزیکی فایل داشته باشد.


# تفاوت Path و URL

یکی از اشتباهات رایج این است که Path و URL را با یکدیگر اشتباه بگیریم.

Path مسیر فیزیکی فایل روی سیستم است.

مثلاً:


/home/site/storage/app/public/products/image.jpg

اما URL آدرسی است که مرورگر برای دسترسی به فایل استفاده می‌کند.

مثلاً:


/storage/products/image.jpg

بنابراین:


Storage::path(...)

و:


Storage::url(...)

کار یکسانی انجام نمی‌دهند.


# ساخت پوشه در Storage

در بسیاری از موارد نیازی نیست پوشه را به صورت دستی ایجاد کنیم.

برای مثال:


Storage::put(

    'products/images/example.jpg',

    $content

);

Laravel در زمان ذخیره فایل می‌تواند ساختار لازم را مدیریت کند.

بنابراین معمولاً لازم نیست قبل از هر Upload به صورت دستی پوشه ایجاد کنیم.


# کار با فایل آپلودشده و Storage

در مقاله قبلی درباره File Upload یاد گرفتیم چگونه فایل را از Request دریافت کنیم.

حالا می‌توانیم آن فایل را روی Disk مشخص ذخیره کنیم.

برای مثال:


$imagePath = $request

    ->file('image')

    ->store('products', 'public');

در اینجا:


Request

↓

Uploaded File

↓

Storage

↓

public Disk

↓

products/

این یکی از رایج‌ترین الگوهای مدیریت تصاویر در پروژه‌های Laravel است.


# ساختار پیشنهادی پوشه‌ها

در پروژه‌های واقعی بهتر است فایل‌ها را بر اساس کاربردشان دسته‌بندی کنیم.

مثلاً:


products/

    images/



users/

    avatars/



articles/

    images/



documents/

    invoices/



orders/

    attachments/

این ساختار باعث می‌شود مدیریت فایل‌ها در پروژه‌های بزرگ‌تر ساده‌تر شود.


# مدیریت فایل‌های خصوصی

یکی از مهم‌ترین مزیت‌های Storage این است که می‌توانیم فایل‌هایی داشته باشیم که مستقیماً Public نباشند.

فرض کنید کاربر یک فایل خصوصی ارسال کرده است:


$path = $request->file('document')

    ->store('documents', 'local');

حالا نمی‌خواهیم کاربر بتواند فقط با داشتن یک URL عمومی به فایل دسترسی پیدا کند.

در چنین شرایطی می‌توانیم یک Route ایجاد کنیم و قبل از ارائه فایل، مجوز دسترسی کاربر را بررسی کنیم.

برای مثال:


public function download(Document $document)

{

    abort_unless(

        $document->user_id === auth()->id(),

        403

    );



    return Storage::download(

        $document->path,

        $document->original_name

    );

}

در این روش ابتدا دسترسی کاربر بررسی می‌شود و سپس فایل برای دانلود ارسال می‌شود.

این الگو برای فایل‌های حساس بسیار مهم است.


# Storage::download چیست؟

اگر بخواهیم فایل را برای دانلود به کاربر ارسال کنیم، می‌توانیم از:


return Storage::download(

    'documents/example.pdf'

);

استفاده کنیم.

می‌توانیم نامی که کاربر هنگام دانلود مشاهده می‌کند را نیز مشخص کنیم:


return Storage::download(

    'documents/example.pdf',

    'invoice.pdf'

);

این قابلیت برای فایل‌های خصوصی و سیستم‌های مدیریت اسناد بسیار کاربردی است.


# Storage و Database

یکی از معماری‌های رایج در پروژه‌های Laravel این است:


Database

    ↓

products

    ↓

image = products/abc123.webp



Storage

    ↓

products/

    ↓

abc123.webp

یعنی Database فقط اطلاعات مربوط به فایل را نگهداری می‌کند و خود فایل در Storage قرار دارد.

برای مثال:


$product->image = 'products/abc123.webp';

این معماری باعث می‌شود Database بیش از حد بزرگ نشود و مدیریت فایل از داده‌های اصلی سیستم جدا بماند.


# آیا مسیر کامل فایل را در Database ذخیره کنیم؟

معمولاً بهتر است مسیر نسبی فایل را ذخیره کنیم.

مثلاً:


products/abc123.webp

نه:


/home/example.com/public_html/storage/app/public/products/abc123.webp

زیرا مسیر فیزیکی سرور ممکن است در محیط‌های مختلف تغییر کند.

ممکن است پروژه از:

  • سیستم توسعه
  • سرور تست
  • سرور Production
  • Storage ابری

استفاده کند.

Storage abstraction کمک می‌کند این وابستگی کاهش پیدا کند.


# استفاده از Storage در Model

بهتر است منطق مربوط به فایل را بی‌دلیل داخل Model قرار ندهیم.

در پروژه‌های ساده می‌توان عملیات را در Service یا Controller انجام داد.

در پروژه‌های بزرگ‌تر بهتر است منطق پیچیده فایل را در یک Service اختصاصی قرار دهیم.

مثلاً:


app/

└── Services/

    └── FileService.php

سپس عملیات‌هایی مانند Upload، Delete و Replace را در آن مدیریت کنیم.

این کار باعث می‌شود Controllerها بیش از حد شلوغ نشوند.


# Storage در پروژه‌های بزرگ

در یک پروژه کوچک ممکن است چند خط کد برای مدیریت فایل کافی باشد.

اما در یک پروژه بزرگ‌تر مانند:

  • فروشگاه اینترنتی
  • CMS
  • Marketplace
  • سیستم آموزشی
  • SaaS
  • سیستم مدیریت اسناد

تعداد فایل‌ها بسیار زیاد می‌شود.

در این شرایط بهتر است موارد زیر از ابتدا در معماری پروژه در نظر گرفته شوند:

  • نوع فایل
  • عمومی یا خصوصی بودن
  • Disk مورد استفاده
  • ساختار پوشه‌ها
  • نام‌گذاری فایل
  • حذف فایل‌های قدیمی
  • دسترسی کاربران
  • Backup
  • فضای ذخیره‌سازی
  • فایل‌های بزرگ
  • Storage خارجی

# استفاده از Storage خارجی

یکی از مزیت‌های Laravel Filesystem این است که معماری Storage به گونه‌ای طراحی شده که می‌توان Storageهای مختلفی را مدیریت کرد.

برای مثال در پروژه‌های بزرگ ممکن است فایل‌ها به جای سرور اصلی روی سرویس‌هایی مانند Object Storage قرار بگیرند.

در چنین معماری‌ای:


Laravel Application

        ↓

Filesystem

        ↓

Object Storage

        ↓

Files

این موضوع برای پروژه‌هایی که تعداد فایل یا حجم Storage زیادی دارند اهمیت زیادی پیدا می‌کند.


# چرا نباید همه فایل‌ها را روی سرور اصلی نگه داریم؟

برای پروژه‌های کوچک نگهداری فایل روی همان سرور کاملاً می‌تواند منطقی باشد.

اما با رشد پروژه ممکن است مشکلاتی ایجاد شود:

  • افزایش مصرف Disk
  • سخت‌تر شدن Backup
  • افزایش حجم Deployment
  • دشوار شدن Scaling
  • وابستگی فایل‌ها به یک Server
  • افزایش هزینه انتقال داده
  • پیچیده‌تر شدن معماری چند سروری

به همین دلیل در پروژه‌های بزرگ استفاده از Object Storage می‌تواند گزینه مناسبی باشد.


# Storage و Backup

فایل‌ها بخشی از اطلاعات مهم یک سیستم هستند.

فرض کنید Database شما به طور کامل Backup شده باشد اما فایل‌های کاربران از بین رفته باشند.

در چنین شرایطی Database ممکن است مسیر فایل را داشته باشد، اما خود فایل دیگر وجود نداشته باشد.

بنابراین Backup حرفه‌ای باید در صورت نیاز هر دو بخش را پوشش دهد:


Database Backup

+

File Storage Backup

این موضوع به‌خصوص برای سایت‌هایی که تصاویر، اسناد یا فایل‌های کاربران را نگهداری می‌کنند بسیار مهم است.


# نکات امنیتی Storage در Laravel

Storage فقط یک ابزار برای ذخیره فایل نیست؛ نحوه استفاده از آن نیز روی امنیت سیستم تأثیر دارد.

فایل‌های خصوصی را Public نکنید

اگر فایل فقط برای یک کاربر خاص است، نباید بدون نیاز در Public Storage قرار بگیرد.

دسترسی را قبل از Download بررسی کنید

برای فایل‌های خصوصی ابتدا مجوز کاربر را بررسی کنید.

مسیر فایل را از کاربر نگیرید

نباید به کاربر اجازه دهید هر مسیر دلخواهی را به برنامه ارسال کند و برنامه مستقیماً همان مسیر را بخواند.

فایل‌های قدیمی را مدیریت کنید

فایل‌هایی که دیگر استفاده نمی‌شوند ممکن است به مرور زمان فضای زیادی مصرف کنند.

نوع فایل را در زمان Upload کنترل کنید

Storage مسئول اعتبارسنجی فایل نیست؛ اعتبارسنجی باید قبل از ذخیره فایل انجام شود.


# تفاوت File Upload و Storage در Laravel

این دو مفهوم ارتباط نزدیکی دارند اما نباید آن‌ها را یکی بدانیم.

File Upload

تمرکز روی دریافت فایل از کاربر است.

مثلاً:


$request->file('image')

و سپس:


$file->store(...)

Storage

تمرکز روی مدیریت محل و نحوه ذخیره فایل است.

مانند:


Storage::put(...)

Storage::get(...)

Storage::delete(...)

Storage::move(...)

Storage::copy(...)

Storage::url(...)

به زبان ساده:


File Upload

= دریافت فایل



Storage

= مدیریت فایل


# اشتباهات رایج در استفاده از Storage

۱. استفاده مستقیم از مسیرهای فیزیکی در همه جای پروژه

این کار وابستگی زیادی به Server ایجاد می‌کند.

بهتر است تا حد امکان از Storage API استفاده شود.


۲. عمومی کردن فایل‌های خصوصی

قرار دادن مدارک و فایل‌های حساس در Public Storage می‌تواند باعث دسترسی غیرمجاز شود.


۳. حذف نکردن فایل قبلی

هنگام تغییر تصویر محصول یا آواتار، اگر فایل قبلی دیگر استفاده نمی‌شود، باید برای حذف آن برنامه داشته باشیم.


۴. ذخیره مسیر فیزیکی در Database

ذخیره مسیرهایی مانند:


/home/user/project/storage/app/...

معمولاً معماری مناسبی نیست.

بهتر است مسیر نسبی فایل ذخیره شود.


۵. استفاده نکردن از Disk مناسب

همه فایل‌ها نباید در یک محل ذخیره شوند.

فایل‌های عمومی و خصوصی معمولاً نیازهای متفاوتی دارند.


# یک مثال کامل مدیریت تصویر محصول

فرض کنیم هنگام ایجاد محصول، تصویر آن را ذخیره می‌کنیم:


public function store(Request $request)

{

    $request->validate([

        'name' => 'required|string|max:255',

        'image' => 'required|image|max:2048',

    ]);



    $path = $request->file('image')

        ->store('products', 'public');



    Product::create([

        'name' => $request->name,

        'image' => $path,

    ]);



    return back();

}

برای نمایش:


<img

    src="{{ Storage::disk('public')->url($product->image) }}"

    alt="{{ $product->name }}"

>

و هنگام حذف محصول:


Storage::disk('public')->delete($product->image);

این الگو یکی از سناریوهای رایج مدیریت تصاویر در پروژه‌های Laravel است.


# چک‌لیست مدیریت فایل در Laravel

قبل از پیاده‌سازی سیستم فایل، این موارد را بررسی کنید:

موردوضعیت مناسب
Validationانجام شود
تعیین نوع فایلانجام شود
محدودیت حجمتعیین شود
Diskمتناسب با نوع فایل انتخاب شود
فایل خصوصیPublic نباشد
Databaseفقط اطلاعات لازم فایل را نگه دارد
نام فایلکنترل‌شده باشد
حذف فایل قدیمیدر صورت نیاز انجام شود
Backupبرای فایل‌ها در نظر گرفته شود
دسترسیبرای فایل‌های خصوصی بررسی شود

# جمع‌بندی

Storage یکی از بخش‌های مهم Laravel برای ساخت برنامه‌هایی است که با فایل سروکار دارند.

به جای اینکه در قسمت‌های مختلف پروژه مستقیماً با مسیرهای فیزیکی سرور کار کنیم، می‌توانیم از Filesystem و Storage Laravel استفاده کنیم.

مهم‌ترین مفاهیمی که در این مقاله یاد گرفتیم عبارت‌اند از:


Filesystem

Disk

local

public

Storage Facade

storage:link

put

get

exists

delete

move

copy

url

path

download

همچنین یاد گرفتیم که فایل‌های عمومی و خصوصی نباید به یک شکل مدیریت شوند و برای فایل‌های حساس باید کنترل دسترسی در نظر گرفته شود.

در پروژه‌های بزرگ‌تر نیز می‌توان Storage را از سرور اصلی جدا کرد و از سرویس‌های Object Storage استفاده کرد.

در نهایت یک معماری رایج برای بسیاری از پروژه‌های Laravel این است:


User

 ↓

Upload

 ↓

Validation

 ↓

Storage

 ↓

File

 ↓

File Path → Database

این ساختار ساده، قابل توسعه و مناسب بسیاری از پروژه‌های واقعی است.


سوالات متداول

Storage در Laravel چیست؟

Storage سیستم مدیریت فایل Laravel است که امکان ذخیره، دریافت، حذف، جابه‌جایی و مدیریت فایل‌ها را با استفاده از Filesystem فراهم می‌کند.

Disk در Laravel چیست؟

Disk مشخص می‌کند عملیات فایل روی کدام نوع یا محل ذخیره‌سازی انجام شود.

دستور storage:link چه کاری انجام می‌دهد؟

این دستور لینک لازم برای دسترسی عمومی به فایل‌های Disk public را ایجاد می‌کند.


php artisan storage:link

تفاوت local و public در Laravel چیست؟

local معمولاً برای فایل‌هایی مناسب است که نباید مستقیماً عمومی باشند؛ در حالی که public برای فایل‌هایی که نیاز به دسترسی عمومی دارند استفاده می‌شود.

چگونه فایل را در Laravel حذف کنیم؟


Storage::delete('example.txt');

یا با Disk مشخص:


Storage::disk('public')->delete('example.txt');

چگونه URL یک فایل را دریافت کنیم؟


Storage::disk('public')->url(

    'products/example.jpg'

);

چگونه فایل را از Laravel دانلود کنیم؟


return Storage::download(

    'documents/example.pdf'

);

آیا باید فایل را داخل Database ذخیره کنیم؟

معمولاً خیر. بهتر است فایل در Storage ذخیره شود و مسیر یا اطلاعات موردنیاز آن در Database قرار گیرد.

آیا می‌توان Storage را به فضای ذخیره‌سازی خارجی متصل کرد؟

بله. Filesystem Laravel برای کار با Storageهای مختلف طراحی شده است و در پروژه‌های بزرگ می‌توان از Object Storage نیز استفاده کرد.

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه