سلام دوستان من پروژم رو با لاراول 8 نوشتم و از storage برای ذخیره فایل هام استفاده میکنم بر روی لوکال مشکلی نداره ولی در هاست تصاویر ایجاد و حذف میشن ولی نمایش داده نمیشن پوشه public همون public html هاست هست و پروژه خودم رو در پوشه laravel قرار دادم که کنار public html هاست هست و لینک ها به صورت زیر هستند
می تونید از روش ساخت route استفاده کنید. در این روش فایل ها را توسط یک route فراخوانی می کنید. مزیت این روش این است که می تونید روی آن از middleware استفاده کنید. ولی باید در نظر داشته باشید که این روش می تواند performance سایت را پائین بیارد.
Route::get('storage/{filename}', function ($filename)
{
$path = storage_path('public/' . $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;
});
اوکی متوجه شدم فکر کنم. شما داری از پوشه استورج لاراول استفاده میکنی و روی یک هاست اشتراکی این مشکل رو داری؟ درسته؟!
اگر اره
توی پوشه config پروژه فایل filesystem.php رو باز کن و این قسمت از کدها رو
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
اون خطی که root نوشته رو تغییرش بده به storage
'public' => [
'driver' => 'local',
'root' => 'storage',
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
اگر vps یا سرور داری میتونی با کامند زیر شورتکات استورج رو ایجاد کنی
php artisan storage:link
مطمئن بشید که symbolic link بنام storage در پوشه public لاراولتون ایجاد شده باشه. و الا امکان نمایش تصاویر وجود نخواهند داشت.
@juza66
احتراما فکر نمیکنم پیشنهاد ویرایش filesystem به شکلی که گفتید کار جالبی باشه و مشکل رو حل کنه.
احتراما فکر نمیکنم پیشنهاد ویرایش filesystem به شکلی که گفتید کار جالبی باشه
راه حل بهتری سراغ داری برای استفاده از استورج توی هاست اشتراکی؟
فکر کنم شورتکات رو نمیشه ایجاد کرد توی هاست اشتراکی!
این راه حل نبود که نوشتم چون فایل هاش رو توی پوشه استورج آدرس دهی کرده پس بهتره برگرده آدرس ها رو اصلاح کنه یا میتونه یک پوشه توی پابلیک آدرس دهی کنه.
راه حل بهتری سراغ داری برای استفاده از استورج توی هاست اشتراکی؟
فکر کنم شورتکات رو نمیشه ایجاد کرد توی هاست اشتراکی!
بله. من در صورتی که دسترسی به SSH برای ایجاد symboli link نداشته باشم از راهکار های زیر استفاده میکنم و تا الان مشکلی نداشتم:
روش اول:
Route::get('/create-symlink', function () {
Artisan::call('storage:link');
});
روش دوم:
استفاده از فانکشن symlink خود PHP.
تنها در یک حالت هیچ راهکاری وجود نداره که شرکت هاستینگ کلا symlink رو غیرفعال کرده باشه که من تا الان مواجه نشدم.
@mhyeganeh
این کدی که نوشتی قبلا سرچ کردم بهش رسیدم ولی الان روی هاستم اجرا کردم
این خطا رو میده!
@azhidhak
جوابتون همون اول تایپیک با تغییر روت دستی به ادرس استورج حله، ولی اون استورجی که مدنظرته قبل از پابلیک نیست و صرفا فقط یک پوشه با نام استورج در پابلیک هست
سلام وقتتون بخیر!
این آدرس مشکل داره مگر این که یک short cut از پوشه storage توی پوشه public_html داشته باشید.
باید ۲ تا کار کنید اونجایی که توی blade گفتید از strogae بخونه رو عوض کنید یا بیخال این قسمت بشید.
و این کد رو به app/Providers/AppServiceProvider.php / اضافه کنید
public function register()
{
if (!env("APP_DEBUG")) {
$this->app->bind('path.public', function () {
return realpath(base_path() . '/../public_html');
});
}
}
نحوه اپلود هم به این صورت میشه.
$imageName = time() . Auth::user()->name . "." . $request->image->getClientOriginalExtension();
$request->image->move(public_path('upload/'), $imageName);
بجای upload هم همون stroge رو بذار که نخوای توی blade ها بری آدرس رو عوض کنی.
@juza66
ارور symlink() has been disabled for security reasons
همون جوری که از ظاهر قضیه هم معلوم هست مربوط به شرکت هاستینگتون هست که این امکان رو غیرفعال کرده. من قبلا از irpower.com و چندجای دیگه هاست اشتراکی گرفتم این مشکل نداشتند و symlink فعال بود. اگر با تیکت هم فعالش نمیکنند هیچ راه دیگری عملا باقی نمیمونه.
@azhidhak
البته ارور شما متفاوت هست با ارور بالا و احتمالا علتش اینه که پوشهای با نام storage/app/public ندارید. اگر نبود خودتون بسازید و مجدد تست کنید.
می تونید از روش ساخت route استفاده کنید. در این روش فایل ها را توسط یک route فراخوانی می کنید. مزیت این روش این است که می تونید روی آن از middleware استفاده کنید. ولی باید در نظر داشته باشید که این روش می تواند performance سایت را پائین بیارد.
Route::get('storage/{filename}', function ($filename)
{
$path = storage_path('public/' . $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;
});
@mohaligateway واقعا دمتون گرم دقیقا دو سال پیش قبل خدمت همین مشکل رو داشتم و این اولین پروژه بعد خدمتم بود که باز همون مشکل بود و حل شد البته با یه تغییر کوچیک
$path = storage_path('public/' . $filename);
به
$path = storage_path('app/public/' . $filename);
کل متن ها رو خوندم تقریبا
هیچکدوم به کارم نیومد
مشکل symlink(): No such file or directory داشتم و نمیتونستم لینک استوریج بسازم داخل هاست
این کد رو از یه سایت بعد 3 4 ساعت گشتن پیدا کردم
که داخل Route میزارین بعد یه بار اجراش میکنین لینک رو میسازه براتون
Route::get('/storage-link', function(){
$target = storage_path('app/public');
$link = public_path('/storage');
symlink($target, $link);
echo "symbolic link created successfully";
})
یه دونه دیگه هم هستش که همون کار رو انجام میده
اینم امتحان کنین
Route::get('/linkstorage', function () { $targetFolder = base_path().'/storage/app/public'; $linkFolder = $_SERVER['DOCUMENT_ROOT'].'/storage'; symlink($targetFolder, $linkFolder); });
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟