راکت
حل شده

storage در لاراول

7 پاسخ

سلام رفقا، مشکلم شاید خیلی ساده باشه ولی شدیدا به کمک نیاز دارم
من یه پروژه لاراولی 9 رو توی هاست لینوکسی آپلود کردم و برای ذخیره عکس ها دارم از storage استفاده میکنم و مشکلم اینه که عکس ها توی فایل storage اضافه و حذف میشن ولی توی پوشه public_html/storage هیچ تغییری نمیاد؛ پروژه کامل کار میکنه روی هاست فقط عکس هایی که تو استورج هستند کار نمیکنن و قابلیت ترمینال هم نداریم متاسفانه

ممنون میشم دستی برسونید

ثبت پرسش جدید

پاسخ‌ها

7
علی مهدوی
علی مهدوی
@mahdavi

تخصص: طراح و توسعه دهنده وب

بهترین پاسخ

سلام
بله متاسفانه سرویس دهنده های هاست اشتراکی به دلایل امنیتی تمام فانکشن های مرتبط با استفاده از قابلیت های ترمینالی لینوکسی رو بستن
برای مثال symlink, exec, cp و ...

عملا لاراول خودش راه حلی برای این موضوع ارائه نمیده چون عملا سرویس های اشتراکی صرفا دسترسی ssh ندارند و نمیشه منابع رو کنترل کرد و در کشورهای دیگه هیچ دستوری رو محدود نمیکنن و اگرم بکنن با پشتیبانی میشه به صورت موردی بازشون کرد که متاسفانه در ایران نمیشه

راه حل دم دستی تا اینکه برید روی یه هاست بهتر یا سرور ابری یا سرور مجازی اینه که در تنظیمات config/filesystems.php برید و مسیر ذخیره root رو در درایور public رو به مسیر public_html و پوشه دلخواهتون تغییر بدید یعنی از مسیر storage خارج بشید

'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],

برای استفاده از فایل هایی که در پوشه storage ذخیره میشن هم که visible نیستن میشه از Storage::disk()->download() استفاده کرد

امین محمدزاده
امین محمدزاده
@amin.webdesign

تخصص: برنامه نویسی وب - Laravel

سلام
زمانی که شما پروژه رو روی لوکال دارید اون پوشه storage داخل public_html یه shortcut هست به storage /app و وقتی که پروژه رو منتقل میکنید روی سرور دیگه اون shortcut تبدیل به پوشه میشه و از مسیر بودن درمیاد که شما باید یه shortcut روی سرور بسازید تا عمل کنه.
برای اینکار یه روش ساده میگم که میتونی باهاش اون shortcut رو بسازی
اول یه route موفق میسازی که بعدا بتونی غیرفعالش کنی حالا با هر اسمی
توی اون route یه تابع بی نام بنویس و کد زیر رو توش بذار و تغییراتت رو بر اساس مسیرهای سرورت تنظیم کن و route رو اجرا کن

$targetFolder = '/_PATH_/storage/app/public';
$linkFolder = '/_PATH_/public_html/amin/storage';
dd(symlink($targetFolder,$linkFolder));

خب متغیر targetFolder مسیر storage اصلی هست که با مقدار الانش باید جایگزین کنی
متغیر linkFolder هم جایی هست که باید برای storage بیای shortcut بسازی
مسیرهارو هم باید به نسبت پنلی که داری مسیریابی کنی که مثلا مسیرهای پنل هایی مثل دایرکت ادمین و سی پنل و ... باهم فرق دارن.
تابع symlink هم میاد بر اساس مقادیری که بهشون میدی کار رو انجام میده. داخل dd هم گذاشتم که بتونی نتیجه بازگشتی رو ببینی.

یوسف جعفری
یوسف جعفری
@titan.2018.yj

@amin.webdesign
سلام رفیق، ممنون از زحمتت برای جواب ولی متاسفانه من این روش رو استفاده کرده بودم ولی بازم اومدم از کدت استفاده کردم و بازم کار نکرد، ظاهرا هاست من به دلایل امنیتی اجازه این کار رو نمیده و ارور زیر رو میده
Call to undefined function symlink()
تو اینجور هاست ها باید چیکار کنیم، لاراول که فریم ورک کاملی هست باید یه راه حل باشه

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

امین محمدزاده
امین محمدزاده
@amin.webdesign

تخصص: برنامه نویسی وب - Laravel

سلام
بحث لاراول نیست. متاسفانه خیلی از شرکتهای هاستینگ یه سری موارد رو برای پاک کردن صورت مسئله های امنیتی غیرفعال میکنن.
برای اینکار یا باید هاست مخصوص لاراول بگیری یا حداقل از سرورهای مجازی استفاده کنی. من خودم روی هاست های ویژه شرکت irpower همین کار رو انجام دادم و مشکلی نبوده. میتونی اون شرکت هم یه بررسی کنی.
یا اینکه این کد رو هم یه تست بکن به جای کدی که دادم بهت

Artisan::call('storage:link');
یوسف جعفری
یوسف جعفری
@titan.2018.yj

ممنون از کمکتون،
@mahdavi
@amin.webdesign
من از راه حل هاتون استفاده کردم ولی متاسفانه جوابی نگرفتم، با هاست هم در میون گذاشتم ولی این اجازه رو به من ندادن، بنابر این فکر کنم تنها راهی که دارم اینکه که عکس ها رو مستقیما توی مسیر public_html ذخیره کنم و تمام فایل های پروژه که تو storage ذخیره میکنه رو حذف کنم؟ یعنی راه دیگه ای نیست؟

امین محمدزاده
امین محمدزاده
@amin.webdesign

تخصص: برنامه نویسی وب - Laravel

اگه فایل خصوصی ندارید بهتره توی همون public_html مسیردهی کنید

علی مهدوی
علی مهدوی
@mahdavi

تخصص: طراح و توسعه دهنده وب

@titan.2018.yj نه متاسفانه در مطلبی هم که اشاره کردم راه حلی روی هاست های اشتراکی محدود شده به غیر اینکه فایل هارو داخل public_html ذخیره کنید وجود نداره

البته اگه فایلی دارید که نمیخواید برای همه قابل دسترس باشه مثل گذشته در درایور private ذخیره کنید و از قابلیت Storage خود لاراول براساس اینکه کاربر اجازه دسترسی دارد یا نه این فایل رو فراخوانی کنید.

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

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