اذهب إلى المحتوى
  • 0

الصور لا تظهر على منصة heroku

اسماعيل صدوقي

السؤال

الصور لا تظهر في الموقع ,نشرت تطبيق لارافيل على منصة heroku و واضع الصور في ملف storage  و كتبت الامر php artizan storage:link

هذا رابط الموقع http://sadouki-cms.herokuapp.com/

كيف يمكنني حل المشكلة ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

للأسف سرفرات هيروكو تمتلك تخزين " سريع الزوال " , أي انك تستطيع اضافة الملفات والصور الى القرص غير أن هاته الملفات لن تكون حاضرة في حالة رفع جديد أو اعادة تشغيل التطبيق وهذا خلال 24 ساعة 
فحل المشكلة هو اما بـ : 
1 . استعمال التخزين العام بداخل مجلد الpublic مباشرة , وهذا بالتعديل على ملف config/filesystems.php :

<?php 


'heroku_public' => [
    'driver' => 'local',
    'root'   => public_path() . '/uploads',
],

 ومن ثم استعمال نمط التخزين على هذا النحو :

<?php 

use Illuminate\Support\Facades\Storage;


...
Storage::disk('heroku_public')->put($your_path, $your_file_content)

 

غير أن هذا لن يحل المشكلة ككل و ستبقى الملفات عامة و ظاهرة و هذا لن يكون في الصالح في حال ما أردت حماية خصوصية المستخدمين . 
فالحل النهائي هو باستخدام تخزين خارجي تماما . مثل : cloudinary , aws s3 . وخصوصا مع الكثير من  الأشياء التي يجعل لارافل العملية بها سهلة . 


و اقترح بقوة استعمال cloudinary cloud storage فسرفرات هيروكو تتوفر على اضافة add-ons تسهل ذلك باسم cloudinary . و من جانب اللارافل موجود على الgithub باكج مفتوحة المصدر تسهل ربط التطبيق بتخزين الكلاود الخاص بك على كلاوديناري باسم laravel-cloudinary . 

 

تم التعديل في بواسطة Adnane Kadri
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

المشكله ان Heroku's filesystem  سربعة الزوال ولذلك لدينا اكثر من حل اسهلهم ان نقوم بعمل راوت لكى يقوم بارجاع الصور لنا من فولدر ال storage كالمثال التالى :

Route::get('images/{filename}', function ($filename) 
{ 
  $path = storage_path() . '/img/' . $filename; 

  if(!File::exists($path)) abort(404);

  $file = File::get($path); 

  $type = File::mimeType($path); 

  $response = Response::make($file, 200);

  $response->header("Content-Type", $type); return $response; 

});

 

حل اخر وهوا ان نتستخدم Amazon S3 وهذا طبعا حل ليس مجانى 

 

ايضا حل اخر وهوا ان تقوم برفع الصور فى فولدر ال public ولكن هذا الحل غير مفضل لاغراض الحماية 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أنصحك بعدم استخدام heroku إلا للتجريب فقط و إذا كان مشروعك بشكل دائم قم بشراء حزمة من heroku أو قم بالأشتراك في استضافة او سيرفر كلاود حتى لا تحدث لك هذه المشكلة مجدداً, لذلك لا تضع مشاريع فعلية على heroku المجانية. 

ثم يمكنك تخزين الصور بداخل مجلد Public حتى تتفادى عمليات المسح المتكرر من قبل شركة heroku فمثلاً, 

if($request->hasFile('image')){
  $img = time() . '.' . $request->file('image')->getClientOriginalExtension();
  $category->image = \URL::to('').'/categories/images/' . $img;
  $request->image->move(public_path('categories/images'), $img);
}

أو استخدام AWS S 3 بهذا الشكل 

$files = $request->file('image'); 
$errors = [];
$i = 0;

foreach ($files as $file) {

  $flebImages = new FlebImage();
  $watermark =  Image::make(public_path('images/logo.png'));
  $name = time() . $file->getClientOriginalName();
  $img = Image::make($file);
  $watermarkSize = $img->width() - 20; //size of the image minus 20 margins
  //#2
  $watermarkSize = $img->width() / 5; //half of the image size
  //#3
  $resizePercentage = 70;//70% less then an actual image (play with this value)
  $watermarkSize = round($img->width() * ((100 - $resizePercentage) / 100), 2); //watermark will be $resizePercentage less then the actual width of the image

  // resize watermark width keep height auto
  $watermark->resize(70, 70, function ($constraint) {
  $constraint->aspectRatio();
  });
  $watermark->opacity(50);
  //insert resized watermark to image center aligned
  //$img->insert($watermark, 'center');
  /*$img->resize(500, 500, function ($constraint) {
  $constraint->aspectRatio();
  //$constraint->upsize();
  });*/
  //$img->insert(public_path('images/logo.jpeg'), 'bottom-right', 10, 10);
  $img->insert($watermark, 'bottom-right', 10, 10);
  $filePath = 'flebs/'. $flebFolder . '/' . $name;
  //detach method is the key! Hours to find it... :
  $resource = $img->stream()->detach();
  \Storage::disk('s3')->put($filePath, $resource);

  $flebImages->image = \Storage::disk('s3')->url($filePath);
  $flebImages->save();
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...