نسخه:

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

معرفی

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

پیکربندی

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

درایور local با فایل‌های ذخیره‌شده به صورت محلی روی سروری که برنامه لاراول را اجرا می‌کند تعامل دارد در حالی که s3 درایور برای نوشتن به سرویس ذخیره‌سازی ابری S3 آمازون استفاده می‌شود.

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

راننده محلی

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

use Illuminate\Support\Facades\Storage;
 
Storage::disk('local')->put('example.txt', 'Contents');

دیسک عمومی

دیسک public موجود در فایل پیکربندی برنامه شما filesystems برای فایل هایی در نظر گرفته شده است که قرار است برای عموم قابل دسترسی باشند. به طور پیش فرض، 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'),
],

این storage:unlink دستور ممکن است برای از بین بردن پیوندهای نمادین پیکربندی شده شما استفاده شود:

php artisan storage:unlink

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

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

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

composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies

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

AWS_ACCESS_KEY_ID=<your-key-id>
AWS_SECRET_ACCESS_KEY=<your-secret-access-key>
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=<your-bucket-name>
AWS_USE_PATH_STYLE_ENDPOINT=false

برای راحتی، این متغیرهای محیطی با قرارداد نامگذاری استفاده شده توسط AWS CLI مطابقت دارند.

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

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

composer require league/flysystem-ftp "^3.0"

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

'ftp' => [
'driver' => 'ftp',
'host' => env('FTP_HOST'),
'username' => env('FTP_USERNAME'),
'password' => env('FTP_PASSWORD'),
 
// Optional FTP Settings...
// 'port' => env('FTP_PORT', 21),
// 'root' => env('FTP_ROOT'),
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],

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

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

composer require league/flysystem-sftp-v3 "^3.0"

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

'sftp' => [
'driver' => 'sftp',
'host' => env('SFTP_HOST'),
 
// Settings for basic authentication...
'username' => env('SFTP_USERNAME'),
'password' => env('SFTP_PASSWORD'),
 
// Settings for SSH key based authentication with encryption password...
'privateKey' => env('SFTP_PRIVATE_KEY'),
'passphrase' => env('SFTP_PASSPHRASE'),
 
// Settings for file / directory permissions...
'visibility' => 'private', // `private` = 0600, `public` = 0644
'directory_visibility' => 'private', // `private` = 0700, `public` = 0755
 
// Optional SFTP Settings...
// 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'),
// 'maxTries' => 4,
// 'passphrase' => env('SFTP_PASSPHRASE'),
// 'port' => env('SFTP_PORT', 22),
// 'root' => env('SFTP_ROOT', ''),
// 'timeout' => 30,
// 'useAgent' => true,
],

فایل سیستم های محدوده و فقط خواندنی

دیسک‌های Scoped به شما امکان می‌دهند یک فایل سیستم تعریف کنید که در آن همه مسیرها به طور خودکار با یک پیشوند مسیر معین پیشوند شوند. قبل از ایجاد یک دیسک فایل سیستم با محدوده، باید یک بسته اضافی Flysystem را از طریق مدیر بسته Composer نصب کنید:

composer require league/flysystem-path-prefixing "^3.0"

می‌توانید با تعریف دیسکی که از scoped درایور استفاده می‌کند، یک نمونه با محدوده مسیر از هر دیسک سیستم فایل موجود ایجاد کنید. به عنوان مثال، می‌توانید دیسکی ایجاد کنید که s3 دیسک موجود شما را به یک پیشوند مسیر خاص محدود می‌کند، و سپس هر عملیات فایل با استفاده از دیسک scoped شما از پیشوند مشخص شده استفاده می‌کند:

's3-videos' => [
'driver' => 'scoped',
'disk' => 's3',
'prefix' => 'path/to/videos',
],

دیسک‌های «فقط خواندنی» به شما امکان می‌دهند دیسک‌های سیستم فایلی بسازید که اجازه عملیات نوشتن را نمی‌دهند. قبل از استفاده از read-only گزینه پیکربندی، باید یک بسته اضافی Flysystem را از طریق مدیر بسته Composer نصب کنید:

composer require league/flysystem-read-only "^3.0"

در مرحله بعد، می توانید read-only گزینه پیکربندی را در یک یا چند آرایه پیکربندی دیسک خود قرار دهید:

's3-videos' => [
'driver' => 's3',
// ...
'read-only' => true,
],

فایل سیستم های سازگار با آمازون S3

به طور پیش فرض، فایل پیکربندی برنامه شما filesystems حاوی یک پیکربندی دیسک برای s3 دیسک است. علاوه بر استفاده از این دیسک برای تعامل با Amazon S3، می‌توانید از آن برای تعامل با هر سرویس ذخیره‌سازی فایل سازگار با S3 مانند MinIO یا DigitalOcean Spaces استفاده کنید .

به طور معمول، پس از به‌روزرسانی اعتبار دیسک برای مطابقت با اعتبار سرویسی که قصد استفاده از آن را دارید، فقط باید مقدار endpoint گزینه پیکربندی را به‌روزرسانی کنید. مقدار این گزینه معمولاً از طریق AWS_ENDPOINT متغیر محیطی تعریف می شود:

'endpoint' => env('AWS_ENDPOINT', 'https://minio:9000'),

MinIO

برای اینکه ادغام Flysystem لاراول URL های مناسبی را هنگام استفاده از MinIO ایجاد کند، باید AWS_URL متغیر محیطی را طوری تعریف کنید که با URL محلی برنامه شما مطابقت داشته باشد و نام سطل را در مسیر URL شامل شود:

AWS_URL=http://localhost:9000/local

هنگام استفاده از MinIO ، ایجاد URLهای ذخیره موقت از طریق این temporaryUrl روش پشتیبانی نمی شود.

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

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

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

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

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

دیسک های درخواستی

گاهی اوقات ممکن است بخواهید با استفاده از یک پیکربندی مشخص، یک دیسک در زمان اجرا ایجاد کنید، بدون اینکه آن پیکربندی واقعاً در filesystems فایل پیکربندی برنامه شما وجود داشته باشد. برای انجام این کار، می توانید یک آرایه پیکربندی را به روش Storage نما ارسال کنید build :

use Illuminate\Support\Facades\Storage;
 
$disk = Storage::build([
'driver' => 'local',
'root' => '/path/to/root',
]);
 
$disk->put('image.jpg', $content);

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

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

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

اگر فایلی که بازیابی می کنید حاوی JSON است، می توانید از json روش برای بازیابی فایل و رمزگشایی محتوای آن استفاده کنید:

$orders = Storage::json('orders.json');

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

if (Storage::disk('s3')->exists('file.jpg')) {
// ...
}

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

if (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 دایرکتوری اشاره می کند.

هنگام استفاده از local درایور، مقدار بازگشتی url URL کدگذاری نشده است. به همین دلیل، توصیه می کنیم همیشه فایل های خود را با استفاده از نام هایی ذخیره کنید که URL های معتبر ایجاد می کنند.

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

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

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

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

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

use Illuminate\Support\Facades\Storage;
 
$url = Storage::temporaryUrl(
'file.jpg', now()->addMinutes(5)
);

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

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

اگر نیاز به سفارشی کردن نحوه ایجاد URL های موقت برای یک دیسک ذخیره سازی خاص دارید، می توانید از این buildTemporaryUrlsUsing روش استفاده کنید. برای مثال، اگر کنترل‌کننده‌ای دارید که به شما امکان می‌دهد فایل‌های ذخیره‌شده از طریق دیسکی که معمولاً از URL‌های موقت پشتیبانی نمی‌کند، دانلود کنید، می‌تواند مفید باشد. معمولاً این روش باید از boot روش ارائه دهنده خدمات فراخوانی شود :

<?php
 
namespace App\Providers;
 
use DateTime;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Storage::disk('local')->buildTemporaryUrlsUsing(
function (string $path, DateTime $expiration, array $options) {
return URL::temporarySignedRoute(
'files.download',
$expiration,
array_merge($options, ['path' => $path])
);
}
);
}
}

URL های آپلود موقت

توانایی ایجاد URL های آپلود موقت فقط توسط s3 درایور پشتیبانی می شود.

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

use Illuminate\Support\Facades\Storage;
 
['url' => $url, 'headers' => $headers] = Storage::temporaryUploadUrl(
'file.jpg', now()->addMinutes(5)
);

این روش در درجه اول در محیط‌های بدون سرور مفید است که به برنامه سمت سرویس گیرنده نیاز دارد تا فایل‌ها را مستقیماً در یک سیستم ذخیره‌سازی ابری مانند Amazon S3 آپلود کند.

فراداده فایل

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

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

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

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

نوع MIME یک فایل داده شده را می توان از طریق mimeType روش زیر بدست آورد:

$mime = Storage::mimeType('file.jpg');

مسیرهای فایل

می توانید از این path روش برای بدست آوردن مسیر یک فایل معین استفاده کنید. اگر از درایور استفاده می کنید local ، این مسیر مطلق را به فایل برمی گرداند. اگر از درایور استفاده می کنید s3 ، این روش مسیر نسبی را به فایل موجود در سطل S3 برمی گرداند:

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

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

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

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

می نویسد ناموفق

اگر put متد (یا سایر عملیات "نوشتن") نتواند فایل را روی دیسک بنویسد، false برگردانده می شود:

if (! Storage::put('file.jpg', $contents)) {
// The file could not be written to disk...
}

در صورت تمایل، می توانید throw گزینه ای را در آرایه پیکربندی دیسک فایل سیستم خود تعریف کنید. هنگامی که این گزینه به صورت تعریف می‌شود true ، روش‌های "نوشتن" مانند زمانی که عملیات نوشتن با شکست مواجه put می‌شود، نمونه‌ای را پرتاب می‌کند : League\Flysystem\UnableToWriteFile

'public' => [
'driver' => 'local',
// ...
'throw' => true,
],

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

متدهای 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');

جریان خودکار

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

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

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

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

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

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

در برنامه های کاربردی وب، یکی از رایج ترین موارد استفاده برای ذخیره فایل ها، ذخیره فایل های آپلود شده توسط کاربر مانند عکس ها و اسناد است. لاراول ذخیره فایل های آپلود شده را با استفاده از 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.
*/
public function update(Request $request): string
{
$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\WhitespacePathNormalizer::normalizePath روش عادی سازی می شوند.

تعیین یک دیسک

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

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

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

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

سایر اطلاعات فایل آپلود شده

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

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

با این حال، به خاطر داشته باشید که روش‌های getClientOriginalName و getClientOriginalExtension ناامن در نظر گرفته می‌شوند، زیرا نام و پسوند فایل ممکن است توسط یک کاربر مخرب دستکاری شود. به همین دلیل، معمولاً باید روش ها hashName و extension را برای دریافت نام و پسوند برای آپلود فایل داده شده ترجیح دهید:

$file = $request->file('avatar');
 
$name = $file->hashName(); // Generate a unique, random name...
$extension = $file->extension(); // Determine the file's extension based on the file's MIME type...

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

در ادغام 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'
);

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

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

'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'permissions' => [
'file' => [
'public' => 0644,
'private' => 0600,
],
'dir' => [
'public' => 0755,
'private' => 0700,
],
],
'throw' => false,
],

حذف فایل ها

این 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('path/file.jpg');

دایرکتوری ها

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

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

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

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

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

$directories = Storage::directories($directory);
 
$directories = Storage::allDirectories($directory);

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

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

Storage::makeDirectory($directory);

یک دایرکتوری را حذف کنید

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

Storage::deleteDirectory($directory);

آزمایش کردن

روش Storage نما fake به شما این امکان را می دهد که به راحتی یک دیسک جعلی تولید کنید که در ترکیب با ابزارهای تولید فایل کلاس Illuminate\Http\UploadedFile ، آزمایش آپلود فایل را تا حد زیادی ساده می کند. مثلا:

<?php
 
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
 
test('albums can be uploaded', function () {
Storage::fake('photos');
 
$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
]);
 
// Assert one or more files were stored...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
 
// Assert one or more files were not stored...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
 
// Assert that a given directory is empty...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
});
<?php
 
namespace Tests\Feature;
 
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_albums_can_be_uploaded(): void
{
Storage::fake('photos');
 
$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
]);
 
// Assert one or more files were stored...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
 
// Assert one or more files were not stored...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
 
// Assert that a given directory is empty...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
}
}

به طور پیش فرض، این fake روش تمام فایل های موجود در فهرست موقت خود را حذف می کند. اگر می خواهید این فایل ها را نگه دارید، می توانید به جای آن از روش "persistentFake" استفاده کنید. برای اطلاعات بیشتر در مورد آزمایش آپلود فایل، می توانید به اطلاعات مستندات آزمایش HTTP در مورد آپلود فایل مراجعه کنید .

این image روش به پسوند GD نیاز دارد .

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

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

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

composer require spatie/flysystem-dropbox

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

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

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

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