اتصال به فضای ذخیرهسازی ابری در برنامههای Laravel
پروژه و کدهای مورد استفاده در ویدیوی فوق در اینجا قابل مشاهده و دسترسی هستند.
برای استفاده از Object Storage در برنامههای Laravel، میتوانید از
پکیج league/flysystem-aws-s3-v3 استفاده کنید که بایستی با دستور زیر، آن را در پروژه خود، نصب کنید:
کپی
composer require league/flysystem-aws-s3-v3
پس از آن، کافیست تا طبق مستندات ایجاد کلید، یک کلید جدید برای باکت خود بسازید.
اطلاعات مربوط به ENDPOINT و نام باکت نیز در صفحه تنظیمات، در بخش دسترسی با SDK،
برای شما قرار گرفته است.
در نهایت نیز، بایستی
اطلاعات مربوط به Object Storage خود را
به متغیرهای محیطی برنامه خود، اضافه کنید؛ به عنوان مثال (در صورتی که متغیرهای زیر از قبل تعریف شده بودند، فقط آنها را مقداردهی کنید):
تمامی کارها انجام شده است و میتوانید از Object Storage در برنامه خود، استفاده کنید؛
به عنوان مثال،
میتوانید با اجرای دستورات زیر، در پروژه خود،
برای هر عملیات در فضای ذخیرهسازی ابری، یک کنترلر ایجاد کنید:
نمونه کد برای نمایش فایلهای یک باکت و اسامی باکتها
کپی
// app/Http/Controllers/S3/StorageController.php
<?php
namespace AppHttpControllersS3;
use AppHttpControllersController;
use IlluminateSupportFacadesStorage;
use IlluminateHttpRequest;
class StorageController extends Controller
{
public function index()
{
$files = Storage::disk('s3')->allFiles();
$buckets = ['default' => config('filesystems.disks.s3.bucket')];
return view('s3-storage', compact('files', 'buckets'));
}
}
نمونه کد برای آپلود فایل در باکت و مشاهده لینک دائمی آن
کپی
// app/Http/Controllers/S3/UploadController.php
<?php
namespace AppHttpControllersS3;
use AppHttpControllersController;
use IlluminateSupportFacadesStorage;
use IlluminateHttpRequest;
class UploadController extends Controller
{
public function upload(Request $request)
{
$request->validate([
'file' => 'required|file',
]);
$file = $request->file('file');
$path = $file->store('', 's3');
$permanentLink = Storage::disk('s3')->url($path);
return redirect()->route('s3.index')->with('success', 'File uploaded successfully.')
->with('permanentLink', $permanentLink);
}
}
نمونه کد برای دانلود فایل از باکت
کپی
// app/Http/Controllers/S3/DownloadController.php
<?php
namespace AppHttpControllersS3;
use IlluminateSupportFacadesStorage;
use IlluminateHttpRequest;
use AppHttpControllersController;
class DownloadController extends Controller
{
public function download($file)
{
if (!Storage::disk('s3')->exists($file)) {
return back()->withErrors(['error' => 'File not found.']);
}
return Storage::disk('s3')->download($file);
}
}
نمونه کد برای حذف فایل از باکت
کپی
// app/Http/Controllers/S3/DeleteController.php
<?php
namespace AppHttpControllersS3;
use IlluminateSupportFacadesStorage;
use IlluminateHttpRequest;
use AppHttpControllersController;
class DeleteController extends Controller
{
public function delete($file)
{
if (!Storage::disk('s3')->exists($file)) {
return back()->withErrors(['error' => 'File not found.']);
}
Storage::disk('s3')->delete($file);
return redirect()->route('s3.index')->with('success', 'File deleted successfully.');
}
}
نمونه کد برای ایجاد لینک موقت برای فایلها
کپی
// app/Http/Controllers/S3/PresignedController.php
<?php
namespace AppHttpControllersS3;
use IlluminateSupportFacadesStorage;
use IlluminateHttpRequest;
use AppHttpControllersController;
class PresignedController extends Controller
{
public function generatePresignedUrl($file)
{
if (!Storage::disk('s3')->exists($file)) {
return back()->withErrors(['error' => 'File not found.']);
}
$url = Storage::disk('s3')->temporaryUrl($file, now()->addHours(1));
return response()->json(['url' => $url]);
}
}
برای استفاده از کنترلرها، بایستی قطعه کد زیر را، به فایل web.php در مسیر routes اضافه کنید:
کپی
use AppHttpControllersS3StorageController;
use AppHttpControllersS3UploadController;
use AppHttpControllersS3DownloadController;
use AppHttpControllersS3DeleteController;
use AppHttpControllersS3PresignedController;
Route::prefix('s3-storage')->group(function () {
Route::get('/', [StorageController::class, 'index'])->name('s3.index');
Route::post('/upload', [UploadController::class, 'upload'])->name('s3.upload');
Route::get('/download/{file}', [DownloadController::class, 'download'])->name('s3.download');
Route::delete('/delete/{file}', [DeleteController::class, 'delete'])->name('s3.delete');
Route::get('/presigned/{file}', [PresignedController::class, 'generatePresignedUrl'])->name('s3.presigned');
});
در نهایت، کافیست تا یک فایل Blade به نام s3-storage.blade.php در پوشه resources/views، ایجاد کنید و قطعه کد زیر را درون آن قرار دهید:
میتوانید پس از اجرای برنامه، در مسیر s3-storage/ از فضای ذخیرهسازی ابری لیارا استفاده کنید.
نمونه کد دریافت لینک موقت دانلود فایل با دامنه اختصاصی
اگر طبق مستندات اتصال دامنه، یک دامنه اختصاصی به باکت خود متصل کردهاید، سادهترین روش برای دریافت لینک موقت (Presigned) با دامنه اختصاصی این است که لینک را با Endpoint اصلی لیارا تولید کنید و سپس مقدار Host آن را به دامنه اختصاصی تغییر دهید.
برای این کار، لینک باید بهصورت virtual-hosted ساخته شود؛ یعنی نام باکت در ابتدای Host قرار بگیرد (مانند bucket-name.storage.c2.liara.site) و نه در مسیر لینک. دیسک s3 در این مستندات با AWS_USE_PATH_STYLE_ENDPOINT=true تنظیم شده است؛ به همین دلیل، یک دیسک جداگانه با use_path_style_endpoint برابر با false در فایل config/filesystems.php تعریف کنید. گزینهی temporary_url باعث میشود Laravel مقدار Host لینک موقت را بهصورت خودکار به دامنه اختصاصی شما تغییر دهد:
فقط مقدار host را تغییر دهید و پارامترهای *-X-Amz موجود در لینک را دستکاری نکنید؛ در غیر این صورت امضای لینک نامعتبر میشود و دسترسی به فایل با خطا مواجه خواهد شد.