laravel

پلتفرم Laravel

(Laravel Platform)

اتصال به ذخیره‌سازی ابری

بدون شک اتصال برنامه به یک ذخیره‌سازی ابری مطمئن برای نگهداری و ارائه فایل‌های استاتیک وب‌سایت یا داده‌های آپلود شده توسط کاربران، باعث اطمینان خاطر صاحبان کسب و کار و بهبود عملکرد برنامه‌ می‌شود.

فهرست عناوین:

در صورتی که تمایلی به خواندن آموزش متنی ندارید می‌توانید ویدیوی آموزشی زیر ‌را مشاهده کنید.

پروژه و کدهای مورد استفاده در ویدیوی فوق در اینجا قابل مشاهده و دسترسی هستند.

نصب Amazon S3 Driver

ذخیره‌سازی ابری لیارا یک Object Storage است که ساختار آن توسط کمپانی آمازون طراحی شده و S3 نام دارد بنابراین در برنامه‌ی Laravel خود به یک Driver برای ارتباط با ذخیره‌سازی ابری نیاز خواهید داشت که با اجرای دستور زیر نصب خواهد شد:

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

تنظیم کلیدها

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

به قسمت کلیدها رفته:

یک کلید جدید بسازید.

کلید های ساخته شده را کپی کنید. توجه داشته باشید که SECRET_KEY تنها یک بار نمایش داده می‌شود و پس از آن باید کلید را درجایی مطمئن ذخیره کنید.

پیکربندی FileSystem

در مرحله‌ی بعد باید یک FileSystem Driver جدید را به فایل پیکربندی مربوطه در مسیر config/filesystems.php اضافه کنید:

'liara' => [
    'driver' => 's3',
    'endpoint' => env('ENDPOINT_URL'),
    'key' => env('ACCESS_KEY'),
    'secret' => env('SECRET_KEY'),
    'region' => env('DEFAULT_REGION'),
    'bucket' => env('BUCKET_NAME'),
],

تنظیم مشخصات ذخیره‌سازی ابری

در لوکال

درنهایت باید متغیرهای تنظیم شده در فایل config/filesystems.php را به‌منظور امنیت و کنترل راحت‌تر مقادیر، در فایل .env مقدار دهی کنید:

ENDPOINT_URL=https://storage.iran.liara.space
ACCESS_KEY=<Access Key>
SECRET_KEY=<Secret Key>
BUCKET_NAME=<Bucket Name>
DEFAULT_REGION=us-east-1

در لیارا

برای تنظیم مشخصات ذخیره‌سازی ابری در برنامه‌ی Laravel خود باید وارد تنظیمات برنامه شده و در بخش متغیرها با کلیک کردن بر روی دکمه‌ی افزودن متغیر، مشخصات ذخیره‌سازی ابری را وارد کنید.

توجه داشته باشید که فایل .env پروژه‌ی لوکال شما بر روی برنامه‌ی تهیه شده مستقر نخواهد شد.

نحوه استفاده

در پروژه خود می‌توانید یک کنترلر به نام S3Controller.php در مسیرapp/Http/Controllers ایجاد کنید. بعد از ایجاد فایل مذکور، کافیست تا محتوای آن را به شکل زیر بنویسید:

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;

class S3Controller extends Controller
{
    public function showUserInterface()
    {
        return view('userinterface');
    }

    public function uploadFile(Request $request)
    {
        $request->validate([
            'upload_file' => 'required|max:2048', // Adjust the file size validation as needed
        ]);

        $file = $request->file('upload_file');
        $fileName = $file->getClientOriginalName();

        Storage::disk('liara')->put($fileName, file_get_contents($file));

        return redirect()->route('user.interface')->with('success', 'File uploaded successfully');
    }

    public function showObjects()
    {
        $objects = Storage::disk('liara')->allFiles('');
    
        $files = [];
        foreach ($objects as $object) {
            $files[] = [
                'name' => $object,
                'download_link' => Storage::disk('liara')->temporaryUrl($object, now()->addMinutes(5)),
            ];
        }
    
        return view('userinterface', ['files' => $files]);
    }
    

    public function downloadFile(Request $request)
    {
        $fileName = $request->input('download_file');
        return Storage::disk('liara')->download($fileName);
    }

    public function deleteFile(Request $request)
    {
        $fileName = $request->input('delete_file');
        Storage::disk('liara')->delete($fileName);
        
        return redirect()->route('user.interface')->with('success', 'File deleted successfully');
    }
}

اکنون، می‌بایست یک فایل به نام userinterface.blade.php در مسیر resources/views/ایجاد کنید و قطعه کد زیر را درون آن قرار دهید:

<!-- resources/views/userinterface.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>S3 Controller User Interface</title>

    <!-- Add some simple styles for a cleaner look -->
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f4;
            margin: 20px;
            text-align: center;
        }

        h1 {
            color: #333;
        }

        form {
            margin-top: 20px;
        }

        button {
            padding: 10px;
            margin: 5px;
            background-color: #4caf50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }

        ul {
            list-style-type: none;
            padding: 0;
        }

        li {
            background-color: #fff;
            border: 1px solid #ddd;
            margin: 5px 0;
            padding: 10px;
            border-radius: 5px;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }

        .error-message {
            color: #f44336;
            margin-top: 5px;
        }
    </style>
</head>
<body>
    <h1>S3 Controller User Interface</h1>

    @if(session('success'))
        <div style="color: green">{{ session('success') }}</div>
    @endif

    <form action="{{ route('upload.file') }}" method="post" enctype="multipart/form-data">
        @csrf
        <input type="file" name="upload_file" style="margin-right: 10px;">
        <button type="submit">Upload File</button>
        @error('upload_file')
            <div class="error-message">{{ $message }}</div>
        @enderror
    </form>

    <form action="{{ route('show.objects') }}" method="post" style="margin-top: 20px;">
        @csrf
        <button type="submit">Show Objects</button>
    </form>

    @if(isset($files) && count($files) > 0)
        <ul>
            @foreach($files as $file)
                <li>
                    <span>{{ $file['name'] }}</span>
                    <div>
                        <form action="{{ route('download.file') }}" method="post" style="display: inline-block;">
                            @csrf
                            <input type="hidden" name="download_file" value="{{ $file['name'] }}">
                            <button type="submit">Download</button>
                        </form>
                        <form action="{{ route('delete.file') }}" method="post" style="display: inline-block;">
                            @csrf
                            <input type="hidden" name="delete_file" value="{{ $file['name'] }}">
                            <button type="submit" style="background-color: #f44336;">Delete</button>
                        </form>
                    </div>
                </li>
            @endforeach
        </ul>
    @endif
</body>
</html>

پس از این کار، کافیست تا قطعه کد زیر را در فایل web.php در مسیر routes وارد کنید:

use AppHttpControllersS3Controller;

Route::get('/userinterface', function () {
    return view('userinterface');
});

Route::get('/userinterface', [S3Controller::class, 'showUserInterface'])->name('user.interface');
Route::post('/upload-file', [S3Controller::class, 'uploadFile'])->name('upload.file');
Route::post('/show-objects', [S3Controller::class, 'showObjects'])->name('show.objects');
Route::post('/retrieve-file', [S3Controller::class, 'retrieveFile'])->name('retrieve.file');
Route::post('/delete-file', [S3Controller::class, 'deleteFile'])->name('delete.file');
Route::post('/download-file', [S3Controller::class, 'downloadFile'])->name('download.file');

تمامی کارها انجام شده است و اگر متغیرهای محیطی را به درستی تنظیم کرده‌باشید؛ می‌توانید پس از اجرای برنامه، در مسیر /userinterface از فضای ذخیره‌سازی ابری لیارا استفاده کنید؛ با استفاده از قطعه کدهای فوق، شما می‌توانید فایل‌های مدنظرتان را در فضای ذخیره‌سازی ابری لیارا آپلود کنید، دانلود کنید، حذف کنید و یا یک لیست از آن‌ها داشته باشید. بدیهی است که برای تغییر قابلیت‌ها و موارد استفاده، می‌توانید کدهای بالا را شخصی‌سازی کنید.


شما می‌توانید برای کسب اطلاعات بیشتر، مثال‌ها و مستندات این پکیج را مطالعه کنید.


متوجه شدم، برو گام بعدی!
;