راکت
حل شده

مشکل در لاراول storage بعد از آپلود بر روی هاست

18 پاسخ

سلام دوستان من پروژم رو با لاراول 8 نوشتم و از storage برای ذخیره فایل هام استفاده میکنم بر روی لوکال مشکلی نداره ولی در هاست تصاویر ایجاد و حذف میشن ولی نمایش داده نمیشن پوشه public همون public html هاست هست و پروژه خودم رو در پوشه laravel قرار دادم که کنار public html هاست هست و لینک ها به صورت زیر هستند

http://test/storage/images/1561217248.png

اسدی
اسدی
@azhidhak
ثبت پرسش جدید

پاسخ‌ها

18
moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

بهترین پاسخ

می تونید از روش ساخت 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;
});

@azhidhak
@juza66
@mhyeganeh

اسدی
اسدی
@azhidhak

تخصص: لاراول

@juza66 دقیقا کدوم img ؟

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

test.com سایتته؟

شاید پاسخ شما همین‌جا باشد

اسدی
اسدی
@azhidhak

تخصص: لاراول

نه متاسفانه اشتباه از سمت من بود و ویرایش کردم

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

اوکی متوجه شدم فکر کنم. شما داری از پوشه استورج لاراول استفاده میکنی و روی یک هاست اشتراکی این مشکل رو داری؟ درسته؟!

اگر اره
توی پوشه 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',
        ],
سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

اگر vps یا سرور داری میتونی با کامند زیر شورتکات استورج رو ایجاد کنی

php artisan storage:link
محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

مطمئن بشید که symbolic link بنام storage در پوشه public لاراولتون ایجاد شده باشه. و الا امکان نمایش تصاویر وجود نخواهند داشت.

@juza66
احتراما فکر نمی‌کنم پیشنهاد ویرایش filesystem به شکلی که گفتید کار جالبی باشه و مشکل رو حل کنه.

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

احتراما فکر نمی‌کنم پیشنهاد ویرایش filesystem به شکلی که گفتید کار جالبی باشه

@mhyeganeh

راه حل بهتری سراغ داری برای استفاده از استورج توی هاست اشتراکی؟
فکر کنم شورتکات رو نمیشه ایجاد کرد توی هاست اشتراکی!

این راه حل نبود که نوشتم چون فایل هاش رو توی پوشه استورج آدرس دهی کرده پس بهتره برگرده آدرس ها رو اصلاح کنه یا میتونه یک پوشه توی پابلیک آدرس دهی کنه.

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

سلام
روی لوکال سرورتون هم پوشه ای به نام لاراول داشتید ؟ اگر امکانش رو دارید فایل های لاراول رو به پوشه Home اصلی در هاستتون منتقل کنید. برای اطمینان یکبار cache رو هم پاک کنید
@azhidhak

محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

@juza66

راه حل بهتری سراغ داری برای استفاده از استورج توی هاست اشتراکی؟
فکر کنم شورتکات رو نمیشه ایجاد کرد توی هاست اشتراکی!

بله. من در صورتی که دسترسی به SSH برای ایجاد symboli link نداشته باشم از راهکار های زیر استفاده می‌کنم و تا الان مشکلی نداشتم:

روش اول:

Route::get('/create-symlink', function () {
    Artisan::call('storage:link');
});

روش دوم:
استفاده از فانکشن symlink خود PHP.

تنها در یک حالت هیچ راهکاری وجود نداره که شرکت هاستینگ کلا symlink رو غیرفعال کرده باشه که من تا الان مواجه نشدم.

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

@mhyeganeh
این کدی که نوشتی قبلا سرچ کردم بهش رسیدم ولی الان روی هاستم اجرا کردم
توضیح تصویر رو وارد کنید
توضیح تصویر رو وارد کنید

این خطا رو میده!
توضیح تصویر رو وارد کنید

اسدی
اسدی
@azhidhak

تخصص: لاراول

برای منم فعلا هیچکدوم از این روش ها جواب ندادن توضیح تصویر رو وارد کنید

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

@azhidhak
جوابتون همون اول تایپیک با تغییر روت دستی به ادرس استورج حله، ولی اون استورجی که مدنظرته قبل از پابلیک نیست و صرفا فقط یک پوشه با نام استورج در پابلیک هست

https://roocket.ir/discuss/15814#subject-56242

اسدی
اسدی
@azhidhak

تخصص: لاراول

همون اول امتحان کردم نشد @juza66

رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

سلام وقتتون بخیر!
این آدرس مشکل داره مگر این که یک 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 ها بری آدرس رو عوض کنی.

محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

@juza66
ارور symlink() has been disabled for security reasons همون جوری که از ظاهر قضیه هم معلوم هست مربوط به شرکت هاستینگتون هست که این امکان رو غیرفعال کرده. من قبلا از irpower.com و چندجای دیگه هاست اشتراکی گرفتم این مشکل نداشتند و symlink فعال بود. اگر با تیکت هم فعالش نمی‌کنند هیچ راه دیگری عملا باقی نمی‌مونه.


@azhidhak
البته ارور شما متفاوت هست با ارور بالا و احتمالا علتش اینه که پوشه‌ای با نام storage/app/public ندارید. اگر نبود خودتون بسازید و مجدد تست کنید.

اسدی
اسدی
@azhidhak

تخصص: لاراول

@mohaligateway واقعا دمتون گرم دقیقا دو سال پیش قبل خدمت همین مشکل رو داشتم و این اولین پروژه بعد خدمتم بود که باز همون مشکل بود و حل شد البته با یه تغییر کوچیک

    $path = storage_path('public/' . $filename);

به

    $path = storage_path('app/public/' . $filename);
عرفان رسولی
عرفان رسولی
@landa.cloner

تخصص: فول استک وب دولوپر

کل متن ها رو خوندم تقریبا
هیچکدوم به کارم نیومد
مشکل 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); });

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام