رفع الصور والملفات على خدمات amazon S3 Storage في لارافيل

رفع الصور والملفات على خدمات amazon S3 Storage في لارافيل

2024-05-15 وقت القراءه : 6 دقائق

بعض المشاريع يطلب أصحابها أن يتم رفع الصور والملفات على خدمة Amazon S3، ولحسن حظ المطورين الذين يستخدمون إطار العمل لارافيل، فإن لارافيل سهلت لنا القيام بذلك، وكذلك شركة Amazon سهلت عملية رفع الصور وأعطت إمكانيات رائعة، في هذه المقالة سأحاول تلخيص عملية رفع الصور والملفات بشكل سلس.

بداية نذهب للملف config/filesystems.php لتحديد default driver وتغييرها إلى s3

'default' => env('FILESYSTEM_DRIVER', 's3'),

كما نلاحظ في إعدادات disk=>s3

's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
],

نلاحظ أنه يجب تحديد مجموعة من المتغيرات التي يجب التعديل عليها في ملف .env  وهي 

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

 

كيف أحصل على هذه القيم.

 

بعد إنشاء حساب والدخول إلى aws console في خانة البحث نبحث عن s3


ننشئ حساب جديد من خلال الضغط على new bucker حيث يجب تعبئة الإسم والمنطقة Region.

سوف أختار إسم etharshrouf.com

الضغط على create bucket.

 

بعد إنشاء bucket سيظهر هذا bucket في قائمة buckets.

 

 

 

من خلال الصوره يتضح لنا قيمة Aws_BUCKET و Region

AWS_DEFAULT_REGION=us-east-2
AWS_BUCKET=etharshrouf.com

وكي نحصل على key و access_key نذهب الى aws console مره أخرى ونبحث عن iam.

حيث يجب إضافة user 

 

يجب تعبئة إسم الـ user وإختيار النوع

 

في شاشة الصلاحيات يمكن إنشاء group وتحديد صلاحيات أو نسخ صلاحيات من مستخدم موجود لكن ما سأقوم بإختياره هو attatch existing polices directly وفي الـ policy سوف أبحث عن s3 وأختار AmazonS3FullAccess.

 

في شاشة tags ممكن أن لا يتم تعبئة أي tag فهي إختيارية.

 

تظهر شاشة المراجعة نضغط على create user.

تظهر شاشة نجاح إنشاء المستخدم فمنها نحصل على access key ID, Secret access key.

 

بعد الإنتهاء من إعدادات ملف .env يجب إنشاء adapter 

composer require league/flysystem-aws-s3-v3:~1.0

رابط الموقع الرسمي

 

الأن نكون قد إنتهينا من الإعدادات وأصبح كل شيئ جاهز لرفع الملفات.

فلو لدينا الفورم التالي

 

وفي الكونترولر

public function store(Request $request){
    $author=Author::create([
         'first_name'=>$request->first_name,
        'last_name'=>$request->last_name,
    ]);
    if($request->hasFile('avatar')){
        $file=$request->file('avatar');
         $filename=$file->getClientOriginalName();
         $file->storeAs('avatars/'.$author->id,$filename,'s3');
        $author->update([
            'avatar'=>$filename
        ]);
    }
}

 

ستتم عملية رفع الصوره بنجاح إلى aws s3، فلو ذهبنا إلى aws console ثم s3 ومن ثم إسم bucket الذي تم إنشاؤه سنجد الصوره تم رفعها.

وفي قاعدة البيانات تم تسجيل إسم الصوره في الحقل avatar.

 



تحميل download الملف / الصوره

لعرض الصوره نستخدم  Storage::disk ومن ثم إسم driver ومن ثم مسار الملف/ الصوره

public function getAvatar($userId){
     $author=Author::findOrFail($userId);
    return Storage::disk('s3')->response('avatars/'.$userId.'/'.$author->avatar);
}

 

عرض الصوره في الموقع

عرض الصوره بالموقع يتم من خلال إستخدام storage::disk وتحديد نوعها بـ s3 ومن ثم المسار الذي تم رفع الصوره عليه.

<img src="{{ Storage::disk('s3')->url('avatars/'.auth()->id().'/'.auth()->user()->avatar) }}"/>

لكن عند فتح الموقع فإن الصوره لن تظهر وعند فتح console نجد أن status of 403 وذلك لأنه لا يوجد صلاحيات لعرض الصور، ولحل هذه المشكله يوجد خطوتين .

الخطوة الأولى في Laravel يجب الذهاب الى الملف config/filesystems.php وإعطاء disk=>s3 قيمة visibility بـ public.

's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'visibility' => 'public',
],

 

الخطوة الثانية في إعدادات bucket الذي تم إنشاؤه حيث يجب الضغط على permissions من أجل تعديلها

ومن ثم تعديل الصلاحيات وجعلها off

الأن يمكننا مشاهدة الصور التي سيتم رفعها أما الصور التي تم رفعها مسبقا لا نستطيع مشاهدتها لأن الصلاحيات الجديده لم تطبق عليها.

 

 

التعديل

في تعديل الصور إذا تم رفع صوره جديده فإننا بحاجة لحذف الصورة القديمة ، وللقيام بذلك من خلال controller.

Storage::disk('s3')->delete('avatars/52/mm.png');

 

الروابط المؤقتة Temporary Urls.

تخيل أن لدينا صور بالموقع ولا نريد أن يتم إستخدام هذه الصور في مواقع أخرى، يتم ذلك من خلال إستخدام temporaryUrl، وتحديد مدة صلاحية رابط الصوره

<img src="{{ Storage::disk('s3')->temporaryUrl('avatars/52/img.png',now()->addMinute(2)) }}"/>

فلو تم أخذ رابط الصوره فإنها بعد دقيقتين لن تظهر لأن الرابط سيصبح expired.

إضافة تعليق
Loading...