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