اسدی
3 سال پیش توسط اسدی مطرح شد
18 پاسخ

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

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

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


ثبت پرسش جدید
moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
1

می تونید از روش ساخت 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 3 سال پیش مطرح شد
0

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش مطرح شد
0

test.com سایتته؟


اسدی
تخصص : لاراول
@azhidhak 3 سال پیش آپدیت شد
0

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش مطرح شد
-1

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

اگر اره
توی پوشه 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 3 سال پیش مطرح شد
0

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

php artisan storage:link

محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

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

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
0

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

@mhyeganeh

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

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


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش آپدیت شد
0

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


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

@juza66

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

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

روش اول:

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

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

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
0

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

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


اسدی
تخصص : لاراول
@azhidhak 3 سال پیش مطرح شد
0

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش مطرح شد
0

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

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


اسدی
تخصص : لاراول
@azhidhak 3 سال پیش مطرح شد
0

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


رضا پارسیان
تخصص : توسعه دهنده Php , Laravel
@Rp76 3 سال پیش مطرح شد
0

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


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

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


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


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
1

می تونید از روش ساخت 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 3 سال پیش مطرح شد
1

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

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

به

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

عرفان رسولی
تخصص : فول استک وب دولوپر
@landa.cloner 3 سال پیش آپدیت شد
0

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

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

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