ساخت url های موقت در لاراول temporary Signed Route

ساخت url های موقت در لاراول temporary Signed Route

laravel temporary Signed Route یک پکیچ برای ساخت url های موقت است که عموما برای سایت دانلودی مورد استفاده قرار خواهد گرفت، تولید Url موقت می تواند بعد از یک تایم مشخص مثل 24 ساعتبی اعتبار شود.

زمان مطالعه: 3 دقیقه
بازدید: 1412
پرسش و پاسخ: 0

این یک بحث جالب هستش و به نظرم اول باید یک سری مقدمات رو برای شما توضیح بدم فرض کنید یک فایل apk برای دانلود روی سایتتون دارید و می خواهید یک url مستقیم براش تولید کنید خب برای ایجاد آدرس https://jobteam.ir/download_app در فایل web.php کد ذیل را ایجاد می کنیم

Route::get('download_app',function (){    
$file_path = base_path().'/public/uploads/jobteam.apk';
if (file_exists($file_path))     {
        return response()->download($file_path);    
}     else     {        
exit('فایل در حال به روز رسانی می باشد و فعلا قابل دانلود نمی باشد.');    
}});

این نوع تولید لینک همیشه در دسترس و ثابت می باشد و برای فایل های عمومی بسیار خب می باشد اما اگر یک فایل داشته باشیم که بخواهیم کاربران در صورت درخواست دانلود، مثلا تا 24 ساعت باید دانلود کنند چه کاری باید انجام بدیم؟  خب مسئله یکم پیچیده میشه اما ما در این مطالب از سری مطالب لاراول این موضوع رو آموزش خواهیم داد

ساخت یک آدرس موقت دانلود در لاراول یا laravel temporary Signed Route

مرحله اول افزودن middleware با عنوان signed هستش که از نسخه 5.6.12 به بعد به لاراول اضافه شده است پس مطابق کد ذیل این middleware رو به قسمت protected $routeMiddleware در فایل kernel.php اضافه می کنیم

 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,

برای اطمینان از افزودن شدن این middleware سعی کنید کش فریم ورک لاراول رو پاک کنید و از اول config کنید.

مرحله دوم ساخت یک کنترلر برای هدایت و ساخت آدرس موقت به اسم FileController می باشد می توانید با استفاده از دستور ذیل یک کنترلر ایجاد کنید

php artisan make:controller FileController

تابعی با عنوان getSignedUrl در این کنترلر ایجاد می کنیم که شناسه یک ردیف از جدول که اطلاعات فایل مورد نظر ما در آن ذخیره شده رو با پارامتر id به این تابع پاس میدیم

public function getSignedUrl($id)     {        
// add if user by this can download file        
return redirect(URL::temporarySignedRoute('UserDownloadFile',now()->addHours(1), ['id' => $id,'user' => Auth::user()->id])); }

دقت کنید ما از temporarySignedRoute برای ایجاد یک آدرس موقت استفاده می کنیم که اولین آرگومان نام مسیر اصلی فایل است دومین آرگومان زمان اعتبار این آدرس است و سومین آرگومان یک آرایه شامل شناسه فایل مورد نظر و شناسه کاربر درخواست دهنده این url می باشد. سپس ما تابع UserDownloadFile در این کنترلر ایجاد می کنیم

public function getFile($id)     {        
    $find=ProductFile::findOrFail($id); // اطلاعات مسیر ذخیره و ... رو از دیتابیس خوندیم        
    $file_path = base_path().'/public/upload/document/'.$find->link.'/'.$find->name_file;        
    if (file_exists($file_path))         {            
    return response()->download($file_path);        
    }         else         {            
    exit('فایل در حال به روز رسانی می باشد و فعلا قابل دانلود نمی باشد.');        
  }    
}

کد کامل این کنترلر به این صورت خواهد بود

namespace App\Http\Controllers\Visitor;
use App\ProductFile; // مدل حاوی اطلاعات فایل 
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\URL; // فراخوانی کلاس های ساخت آدرس موقت
class FileController extends Controller
{
    public function getSignedUrl($id)
    {
       // add if user by this can download file
        return redirect(URL::temporarySignedRoute('UserDownloadFile',now()->addHours(1), ['id' => $id,'user' => Auth::user()->id]));
    }
    public function getFile($id)
    {
        $find=ProductFile::findOrFail($id);
        $file_path = base_path().'/public/upload/document/'.$find->link.'/'.$find->name_file;
        if (file_exists($file_path))
        {
            return response()->download($file_path);
        }
        else
        {
            exit('فایل در حال به روز رسانی می باشد و فعلا قابل دانلود نمی باشد.');
        }
    }
}

حالا مسیرهای این متدها به صورت ذیل خواهد بود که من در این مسیرها middleware برای چک کردن لاگین کاربر auth رو هم اضافه کردم

Route::get('file/{id}','Visitor\FileController@getfile')->name('UserDownloadFile')->middleware(['signed','auth']);
Route::get('files/{id}','Visitor\FileController@getSignedUrl')->middleware('auth');

حالا برای دسترسی و دانلود این فایل ها در href لینک مورد نظر کد ذیل رو قرار می دهیم که متغیر id شناسه اطلاعات فایل مورد نظر ماست که در دیتابیس ذخیره شده است.

{{ url('files',['id' => $id]) }}

این کد آدرسی مثل https://jobteam.ir/files/31 در href لینک شما ایجاد خواهد کرد که با مراجعه به این مسیر یک مسیر موقت و هش شده برای شما ایجاد می شود که تا یک ساعت از زمان تولید فرصت دانلود فایل را خواهید داشت. مثال آدرس تولید شده موقت با لاراول

https://jobteam.ir/file/31?expires=1569690642&user=1&signature=00803b155666950e70def455c4d80482bfa9f7b6d7e8bbd70e40c9401f630f82

اگر این آدرس تغییر یا منقضی شود با پیغام Invalid signature 403 پاسخ خواهید گرفت. امیدوارم این آموزش برای تمام دوستداران فریم ورک لاراول جذاب و مفید باشد.

بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

مشاهده تمام مطالب نویسنده