ذخیره سازی فایل
- معرفی
- پیکربندی
- به دست آوردن نمونه های دیسک
- بازیابی فایل ها
- ذخیره سازی فایل ها
- حذف فایل ها
- دایرکتوری ها
- آزمایش کردن
- فایل سیستم های سفارشی
معرفی
لاراول به لطف بسته فوق العاده 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-1AWS_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