نسخه:

ذخیره سازی فایل

معرفی

لاراول به لطف بسته فوق العاده Flysystem PHP توسط Frank de Jonge، یک فایل انتزاعی قدرتمند از سیستم فایل ارائه می دهد. ادغام Laravel Flysystem درایورهای ساده ای را برای کار با فایل سیستم های محلی و Amazon S3 فراهم می کند. حتی بهتر از آن، جابه‌جایی بین این گزینه‌های ذخیره‌سازی بسیار ساده است زیرا API برای هر سیستم یکسان باقی می‌ماند.

پیکربندی

فایل پیکربندی فایل سیستم در آدرس قرار دارد config/filesystems.php . در این فایل می‌توانید تمام «دیسک‌های» خود را پیکربندی کنید. هر دیسک نشان دهنده یک درایور ذخیره سازی و مکان ذخیره سازی خاص است. تنظیمات نمونه برای هر درایور پشتیبانی شده در فایل پیکربندی گنجانده شده است. بنابراین، پیکربندی را تغییر دهید تا اولویت‌ها و اعتبار ذخیره‌سازی شما را منعکس کند.

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

دیسک عمومی

دیسک public برای فایل هایی در نظر گرفته شده است که قرار است برای عموم قابل دسترسی باشند. به طور پیش فرض، public دیسک از درایور استفاده می کند local و این فایل ها را در storage/app/public . برای دسترسی به آنها از وب، باید یک پیوند نمادین از public/storage به ایجاد کنید storage/app/public . این کنوانسیون فایل‌های در دسترس عموم شما را در یک فهرست نگه می‌دارد که در هنگام استفاده از سیستم‌های استقرار بدون توقف مانند Envoyer به راحتی در بین استقرارها به اشتراک گذاشته می‌شود .

برای ایجاد پیوند نمادین، می توانید از storage:link دستور Artisan استفاده کنید:

php artisan storage:link

هنگامی که یک فایل ذخیره شد و پیوند نمادین ایجاد شد، می توانید یک URL برای فایل ها با استفاده از asset راهنما ایجاد کنید:

echo asset('storage/file.txt');

می توانید پیوندهای نمادین اضافی را در filesystems فایل پیکربندی خود پیکربندی کنید. هر یک از پیوندهای پیکربندی شده با اجرای storage:link دستور ایجاد می شود:

'links' => [
public_path('storage') => storage_path('app/public'),
public_path('images') => storage_path('app/images'),
],

راننده محلی

هنگام استفاده از local درایور، تمام عملیات فایل نسبت به دایرکتوری تعریف شده در فایل پیکربندی root شما است. filesystems به طور پیش فرض، این مقدار روی storage/app دایرکتوری تنظیم می شود. بنابراین، روش زیر یک فایل را در storage/app/file.txt :

Storage::disk('local')->put('file.txt', 'Contents');

مجوزها

قابلیت public مشاهده 0755 به دایرکتوری ها و 0644 فایل ها ترجمه می شود . می توانید نگاشت مجوزها را در filesystems فایل پیکربندی خود تغییر دهید:

'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'permissions' => [
'file' => [
'public' => 0664,
'private' => 0600,
],
'dir' => [
'public' => 0775,
'private' => 0700,
],
],
],

پیش نیاز راننده

بسته های composer

قبل از استفاده از درایورهای SFTP یا S3، باید بسته مناسب را از طریق Composer نصب کنید:

  • SFTP: league/flysystem-sftp ~1.0
  • آمازون S3: league/flysystem-aws-s3-v3 ~1.0

یک الزام مطلق برای عملکرد استفاده از یک آداپتور حافظه پنهان است. برای این کار به یک بسته اضافی نیاز دارید:

  • CachedAdapter: league/flysystem-cached-adapter ~1.0

پیکربندی درایور S3

اطلاعات پیکربندی درایور S3 در config/filesystems.php فایل پیکربندی شما قرار دارد. این فایل شامل یک آرایه پیکربندی نمونه برای درایور S3 است. شما آزاد هستید که این آرایه را با پیکربندی S3 و اعتبارنامه خود تغییر دهید. برای راحتی، این متغیرهای محیطی با قرارداد نامگذاری استفاده شده توسط AWS CLI مطابقت دارند.

پیکربندی درایور FTP

ادغام Flysystem لاراول با FTP عالی کار می کند. با این حال، پیکربندی نمونه با فایل پیکربندی پیش‌فرض فریم‌ورک همراه نیست filesystems.php . اگر نیاز به پیکربندی یک فایل سیستم FTP دارید، می توانید از پیکربندی مثال زیر استفاده کنید:

'ftp' => [
'driver' => 'ftp',
'host' => 'ftp.example.com',
'username' => 'your-username',
'password' => 'your-password',
 
// Optional FTP Settings...
// 'port' => 21,
// 'root' => '',
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],

پیکربندی درایور SFTP

ادغام Flysystem لاراول با SFTP عالی کار می کند. با این حال، پیکربندی نمونه با فایل پیکربندی پیش‌فرض فریم‌ورک همراه نیست filesystems.php . اگر نیاز به پیکربندی فایل سیستم SFTP دارید، می توانید از پیکربندی مثال زیر استفاده کنید:

'sftp' => [
'driver' => 'sftp',
'host' => 'example.com',
'username' => 'your-username',
'password' => 'your-password',
 
// Settings for SSH key based authentication...
// 'privateKey' => '/path/to/privateKey',
// 'password' => 'encryption-password',
 
// Optional SFTP Settings...
// 'port' => 22,
// 'root' => '',
// 'timeout' => 30,
],

ذخیره سازی

برای فعال کردن کش برای یک دیسک معین، می توانید یک cache دستورالعمل به گزینه های پیکربندی دیسک اضافه کنید. این cache گزینه باید آرایه ای از گزینه های ذخیره سازی پنهان باشد که شامل disk نام، expire زمان بر حسب ثانیه و حافظه پنهان باشد prefix :

's3' => [
'driver' => 's3',
 
// Other Disk Options...
 
'cache' => [
'store' => 'memcached',
'expire' => 600,
'prefix' => 'cache-prefix',
],
],

به دست آوردن نمونه های دیسک

نما Storage ممکن است برای تعامل با هر یک از دیسک های پیکربندی شده شما استفاده شود. به عنوان مثال، می توانید از put روش روی نما برای ذخیره یک آواتار در دیسک پیش فرض استفاده کنید. اگر متدها را در Storage نما فراخوانی کنید بدون اینکه ابتدا disk متد را فراخوانی کنید، فراخوانی متد به طور خودکار به دیسک پیش فرض ارسال می شود:

use Illuminate\Support\Facades\Storage;
 
Storage::put('avatars/1', $fileContents);

اگر برنامه شما با چندین دیسک تعامل دارد، می توانید از disk روش روی Storage نما برای کار با فایل های روی یک دیسک خاص استفاده کنید:

Storage::disk('s3')->put('avatars/1', $fileContents);

بازیابی فایل ها

این get روش ممکن است برای بازیابی محتویات یک فایل استفاده شود. محتویات رشته خام فایل با روش برگردانده می شود. به یاد داشته باشید، همه مسیرهای فایل باید نسبت به محل "ریشه" پیکربندی شده برای دیسک مشخص شوند:

$contents = Storage::get('file.jpg');

روش exists ممکن است برای تعیین اینکه آیا یک فایل بر روی دیسک وجود دارد استفاده می شود:

$exists = Storage::disk('s3')->exists('file.jpg');

این missing روش ممکن است برای تعیین اینکه آیا یک فایل از دیسک گم شده است استفاده شود:

$missing = Storage::disk('s3')->missing('file.jpg');

دانلود فایل ها

این download روش ممکن است برای ایجاد پاسخی استفاده شود که مرورگر کاربر را مجبور به دانلود فایل در مسیر داده شده کند. این download روش یک نام فایل را به عنوان آرگومان دوم متد می پذیرد، که نام فایلی را که توسط کاربر دانلود کننده فایل مشاهده می شود، تعیین می کند. در نهایت، می توانید آرایه ای از هدرهای HTTP را به عنوان آرگومان سوم به متد ارسال کنید:

return Storage::download('file.jpg');
 
return Storage::download('file.jpg', $name, $headers);

آدرس های فایل

می توانید از این url روش برای دریافت URL برای فایل داده شده استفاده کنید. اگر از درایور استفاده می کنید local ، این معمولاً فقط /storage به مسیر داده شده اضافه می شود و یک URL نسبی به فایل برمی گرداند. اگر از درایور استفاده می کنید s3 ، URL راه دور کاملا واجد شرایط برگردانده می شود:

use Illuminate\Support\Facades\Storage;
 
$url = Storage::url('file.jpg');

به یاد داشته باشید، اگر از درایور استفاده می کنید local ، تمام فایل هایی که باید به صورت عمومی در دسترس باشند باید در دایرکتوری قرار داده شوند storage/app/public . علاوه بر این، باید یک پیوند نمادین ایجاد کنید که در public/storage آن به storage/app/public دایرکتوری اشاره می کند.

آدرس های اینترنتی موقت

برای فایل‌هایی که با استفاده از آن ذخیره می‌شوند، s3 می‌توانید با استفاده از temporaryUrl روش، یک URL موقت برای یک فایل مشخص ایجاد کنید. این روش یک مسیر و یک DateTime نمونه را می‌پذیرد که تعیین می‌کند چه زمانی URL باید منقضی شود:

$url = Storage::temporaryUrl(
'file.jpg', now()->addMinutes(5)
);

اگر نیاز به تعیین پارامترهای درخواست S3 اضافی دارید ، می توانید آرایه پارامترهای درخواست را به عنوان آرگومان سوم به temporaryUrl متد ارسال کنید:

$url = Storage::temporaryUrl(
'file.jpg',
now()->addMinutes(5),
['ResponseContentType' => 'application/octet-stream']
);

سفارشی سازی میزبان URL

اگر می خواهید میزبان را برای URL های فایل تولید شده با استفاده از Storage نما از قبل تعریف کنید، می توانید url گزینه ای را به آرایه پیکربندی دیسک اضافه کنید:

'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],

فراداده فایل

لاراول علاوه بر خواندن و نوشتن فایل ها می تواند اطلاعاتی در مورد خود فایل ها نیز ارائه دهد. به عنوان مثال، size روش ممکن است برای بدست آوردن اندازه فایل در بایت استفاده شود:

use Illuminate\Support\Facades\Storage;
 
$size = Storage::size('file.jpg');

این lastModified روش مُهر زمانی یونیکس آخرین باری که فایل اصلاح شده را برمی گرداند:

$time = Storage::lastModified('file.jpg');

ذخیره سازی فایل ها

این put روش ممکن است برای ذخیره محتوای فایل خام روی دیسک استفاده شود. همچنین می‌توانید یک PHP resource به put روش ارسال کنید، که از پشتیبانی جریان اصلی Flysystem استفاده می‌کند. به یاد داشته باشید، همه مسیرهای فایل باید نسبت به محل "ریشه" پیکربندی شده برای دیسک مشخص شوند:

use Illuminate\Support\Facades\Storage;
 
Storage::put('file.jpg', $contents);
 
Storage::put('file.jpg', $resource);

جریان خودکار

اگر می‌خواهید لاراول به‌طور خودکار جریان یک فایل معین را در محل ذخیره‌سازی شما مدیریت کند، می‌توانید از روش putFile یا استفاده کنید putFileAs . این روش یک Illuminate\Http\File یا Illuminate\Http\UploadedFile نمونه را می پذیرد و به طور خودکار فایل را به مکان مورد نظر شما ارسال می کند:

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
 
// Automatically generate a unique ID for file name...
Storage::putFile('photos', new File('/path/to/photo'));
 
// Manually specify a file name...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

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

متدهای putFile و putFileAs همچنین یک آرگومان را برای مشخص کردن "قابلیت مشاهده" فایل ذخیره شده می پذیرند. اگر فایل را روی یک دیسک ابری مانند S3 ذخیره می‌کنید و می‌خواهید فایل برای عموم قابل دسترسی باشد، این کار به‌ویژه مفید است:

Storage::putFile('photos', new File('/path/to/photo'), 'public');

آماده سازی و الحاق به فایل ها

متدهای prepend و append به شما این امکان را می دهند که در ابتدا یا انتهای یک فایل بنویسید:

Storage::prepend('file.log', 'Prepended Text');
 
Storage::append('file.log', 'Appended Text');

کپی و انتقال فایل ها

این copy روش ممکن است برای کپی کردن یک فایل موجود در یک مکان جدید روی دیسک استفاده شود، در حالی که move روش ممکن است برای تغییر نام یا انتقال یک فایل موجود به یک مکان جدید استفاده شود:

Storage::copy('old/file.jpg', 'new/file.jpg');
 
Storage::move('old/file.jpg', 'new/file.jpg');

آپلودهای فایل

در برنامه های کاربردی وب، یکی از رایج ترین موارد استفاده برای ذخیره فایل ها، ذخیره فایل های آپلود شده توسط کاربر مانند تصاویر پروفایل، عکس ها و اسناد است. لاراول ذخیره فایل های آپلود شده را با استفاده از store روش روی نمونه فایل آپلود شده بسیار آسان می کند. store متد را با مسیری که می خواهید فایل آپلود شده را در آن ذخیره کنید فراخوانی کنید :

<?php
 
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
 
class UserAvatarController extends Controller
{
/**
* Update the avatar for the user.
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$path = $request->file('avatar')->store('avatars');
 
return $path;
}
}

در مورد این مثال باید به چند نکته مهم اشاره کرد. توجه داشته باشید که ما فقط یک نام دایرکتوری را مشخص کردیم، نه نام فایل. به‌طور پیش‌فرض، این store روش یک شناسه منحصربه‌فرد برای استفاده به عنوان نام فایل ایجاد می‌کند. پسوند فایل با بررسی نوع MIME فایل مشخص می شود. مسیر فایل با store روش برگردانده می شود تا بتوانید مسیر را از جمله نام فایل تولید شده در پایگاه داده خود ذخیره کنید.

همچنین می‌توانید putFile روش روی Storage نما را برای انجام همان دستکاری فایل مانند مثال بالا فراخوانی کنید:

$path = Storage::putFile('avatars', $request->file('avatar'));

تعیین نام فایل

اگر مایل نیستید نام فایلی به طور خودکار به فایل ذخیره شده شما اختصاص داده شود، می توانید از روشی استفاده کنید storeAs که مسیر، نام فایل و دیسک (اختیاری) را به عنوان آرگومان های خود دریافت می کند:

$path = $request->file('avatar')->storeAs(
'avatars', $request->user()->id
);

همچنین می توانید از این putFileAs روش در Storage نما استفاده کنید که همان دستکاری فایل را مانند مثال بالا انجام می دهد:

$path = Storage::putFileAs(
'avatars', $request->file('avatar'), $request->user()->id
);

کاراکترهای یونیکد غیرقابل چاپ و نامعتبر به طور خودکار از مسیرهای فایل حذف می شوند. بنابراین، ممکن است بخواهید مسیرهای فایل خود را قبل از انتقال آنها به روش های ذخیره سازی فایل لاراول، پاکسازی کنید. مسیرهای فایل با استفاده از League\Flysystem\Util::normalizePath روش عادی سازی می شوند.

تعیین یک دیسک

به طور پیش فرض، این روش از دیسک پیش فرض شما استفاده می کند. اگر می خواهید دیسک دیگری را مشخص کنید، نام دیسک را به عنوان آرگومان دوم به store متد ارسال کنید:

$path = $request->file('avatar')->store(
'avatars/'.$request->user()->id, 's3'
);

اگر از متد استفاده می کنید storeAs ، می توانید نام دیسک را به عنوان آرگومان سوم به متد ارسال کنید:

$path = $request->file('avatar')->storeAs(
'avatars',
$request->user()->id,
's3'
);

سایر اطلاعات فایل

اگر می خواهید نام اصلی فایل آپلود شده را دریافت کنید، می توانید این کار را با استفاده از getClientOriginalName روش زیر انجام دهید:

$name = $request->file('avatar')->getClientOriginalName();

این extension روش ممکن است برای دریافت پسوند فایل فایل آپلود شده استفاده شود:

$extension = $request->file('avatar')->extension();

قابلیت مشاهده فایل

در ادغام Flysystem لاراول، "Visibility" انتزاعی از مجوزهای فایل در چندین پلت فرم است. فایل ها ممکن است اعلام شوند public یا private . هنگامی که یک فایل اعلام می شود public ، نشان می دهید که فایل به طور کلی باید برای دیگران قابل دسترسی باشد. به عنوان مثال، هنگام استفاده از درایور S3، ممکن است URL های public فایل ها را بازیابی کنید.

هنگام تنظیم فایل، می توانید از طریق put روش زیر، قابلیت مشاهده را تنظیم کنید:

use Illuminate\Support\Facades\Storage;
 
Storage::put('file.jpg', $contents, 'public');

اگر فایل قبلاً ذخیره شده باشد، نمایان بودن آن را می توان از طریق و getVisibility روش های زیر بازیابی و تنظیم کرد setVisibility :

$visibility = Storage::getVisibility('file.jpg');
 
Storage::setVisibility('file.jpg', 'public');

هنگام تعامل با فایل های آپلود شده، می توانید از روش های storePublicly و storePubliclyAs برای ذخیره فایل آپلود شده با public قابلیت مشاهده استفاده کنید:

$path = $request->file('avatar')->storePublicly('avatars', 's3');
 
$path = $request->file('avatar')->storePubliclyAs(
'avatars',
$request->user()->id,
's3'
);

حذف فایل ها

این delete روش یک نام فایل یا آرایه ای از فایل ها را برای حذف از دیسک می پذیرد:

use Illuminate\Support\Facades\Storage;
 
Storage::delete('file.jpg');
 
Storage::delete(['file.jpg', 'file2.jpg']);

در صورت لزوم، می توانید دیسکی را که فایل باید از آن حذف شود را مشخص کنید:

use Illuminate\Support\Facades\Storage;
 
Storage::disk('s3')->delete('folder_path/file_name.jpg');

دایرکتوری ها

دریافت همه فایل ها در یک فهرست

این files روش آرایه ای از تمام فایل های موجود در دایرکتوری معین را برمی گرداند. اگر می‌خواهید فهرستی از تمام فایل‌های موجود در یک فهرست معین از جمله همه زیر شاخه‌ها را بازیابی کنید، می‌توانید از allFiles روش زیر استفاده کنید:

use Illuminate\Support\Facades\Storage;
 
$files = Storage::files($directory);
 
$files = Storage::allFiles($directory);

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

متد directories آرایه ای از همه دایرکتوری های داخل یک دایرکتوری معین را برمی گرداند. علاوه بر این، می‌توانید از این allDirectories روش برای دریافت فهرستی از همه دایرکتوری‌ها در یک فهرست مشخص و همه زیرشاخه‌های آن استفاده کنید:

$directories = Storage::directories($directory);
 
// Recursive...
$directories = Storage::allDirectories($directory);

یک دایرکتوری ایجاد کنید

این makeDirectory روش دایرکتوری داده شده را ایجاد می کند، از جمله زیر شاخه های مورد نیاز:

Storage::makeDirectory($directory);

یک فهرست را حذف کنید

در نهایت، deleteDirectory روش ممکن است برای حذف یک دایرکتوری و همه فایل های آن استفاده شود:

Storage::deleteDirectory($directory);

فایل سیستم های سفارشی

ادغام Flysystem لاراول درایورهایی را برای چندین "راننده" خارج از جعبه فراهم می کند. با این حال، Flysystem به این موارد محدود نمی شود و برای بسیاری از سیستم های ذخیره سازی دیگر آداپتورهایی دارد. اگر می خواهید از یکی از این آداپتورهای اضافی در برنامه لاراول خود استفاده کنید، می توانید یک درایور سفارشی ایجاد کنید.

برای راه اندازی فایل سیستم سفارشی به یک آداپتور Flysystem نیاز دارید. بیایید یک آداپتور Dropbox نگهداری شده از جامعه را به پروژه خود اضافه کنیم:

composer require spatie/flysystem-dropbox

در مرحله بعد، باید یک ارائه دهنده خدمات مانند ایجاد کنید DropboxServiceProvider . در روش ارائه دهنده boot ، می توانید از روش Storage نما extend برای تعریف درایور سفارشی استفاده کنید:

<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
 
class DropboxServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
 
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Storage::extend('dropbox', function ($app, $config) {
$client = new DropboxClient(
$config['authorization_token']
);
 
return new Filesystem(new DropboxAdapter($client));
});
}
}

اولین آرگومان متد extend نام درایور و دومین آرگومان Closure است که متغیرهای $app و را دریافت می کند $config . حل‌کننده بستن باید نمونه‌ای از League\Flysystem\Filesystem . متغیر $config حاوی مقادیر تعریف شده config/filesystems.php برای دیسک مشخص شده است.

سپس، ارائه دهنده خدمات را در config/app.php فایل پیکربندی خود ثبت کنید:

'providers' => [
// ...
App\Providers\DropboxServiceProvider::class,
];

هنگامی که ارائه دهنده خدمات برنامه افزودنی را ایجاد و ثبت کردید، می توانید از درایور در فایل پیکربندی dropbox خود استفاده کنید. config/filesystems.php