راکت
حل شده

مشکل دانلود از storage

13 پاسخ

سلام .
من با استفاده از دانلود امن و
response()->download(storage_path($path))
استفاده میکنم . همه چی تو لوکال خوبه و اوکیه
ولی تو سرور که centos۷ هست کار نمیکنه . تو فایرفاکس میگه file not found تو کروم هم میگه
This site can’t be reached ERR_INVALID_RESPONSE
کسی میدونه مشکل از چی میتونه باشه ؟
فایل موجوده . ادرس هم درسته . تو لوکال هم کاملا درست کار میکنه .

ثبت پرسش جدید

پاسخ‌ها

13
رضا
رضا
@reza159753
بهترین پاسخ

سلام متاسفانه هیچ کدوم از راهکار ها توی سرور ما جواب نداد. سرورمون centos7 بود
در نهایت مجبور شدم از force download خود پی اچ پی استفاده کنم که جواب داد.
کدش رو اینجا میزارم هر کی بعدا به این مشکل خورد میتونه از این روش استفاده کنه .

header("Content-disposition: " . 'attachment; filename="__YOUR_FILE_NAME"');
header("Content-type: " . File::mimeType(storage_path(YOUR_PATH)) );
readfile(storage_path(YOUR_PATH) );

ممنون از همه دوستان که جواب دادند .

امیر یاوندحسنی
امیر یاوندحسنی
@mirmahna.s

تخصص: Full Stack Developer

سلام @reza159753
مطمئن بشید که دستور php artisan storage:link رو در سرور وارد کرده باشید.

رضا
رضا
@reza159753

سلام ممنون از پاسختون .
@mirmahna.s
ولی نه توی اموزش ها نه اینکه تو لوکال نیازی نبود این کارو بکنیم . و بدون اینا داشت درست کار میکرد .
آیا حتما باید این کارو کرد؟

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

رضا
رضا
@reza159753

سلام مجدد . تو لوکال هم از پوشه storage هم از پابلیک میتونم با استفاده از response()->download دانلود کنم
اما تو سرور که تو centos 7 هست نمیتونم .
SELINUX رو بستم بازم جوابی حاصل نشد
من فک میکردم مشکل از پوشه استورج هست اما هر فایلی رو از هر جایی میخوام force download کنم نمیشه تو سرور این کار رو کرد .
آیا تو اپاچی باید تغییراتی بدم ؟
کد:

$headers = array('Content-Type' => File::mimeType(public_path('/books/B_'.$book->id)) );
            return response()->download(public_path('/books/B_'.$book->id , $headers));

دوستان لطفا اگه میشه راهنمایی کنید خیلی فوریه .

@ali.bayat
@hesammousavi

علی بیات
علی بیات
@ali.bayat

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

درود
دوستمون هم اشاره کردند. اگر از php artisan storage:link استفاده نکردید .. این گزینه اول هست

چنانچه اطلاعات کامل‌تری راجب استفاده از Storage و نحوه عملکردش نیاز داشتید.... من چند وقت پیش یه مقاله در این باره نوشتم، لینکشو براتون میگذارم.

کار کردن با فایل‌ها در فریم‌ورک لاراول

موفق باشید

رضا
رضا
@reza159753

سلام
منم فکر میکرد مشکل همینه ولی ربطی به استوریج نداره . من حتی فایل های تو پابلیک رو هم نمیتونم دانلود کنم
@ali.bayat

علی بیات
علی بیات
@ali.bayat

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

کدهای بیشتری رو به اشتراک بگذارید

رضا
رضا
@reza159753

سلام کد خاصی نیست .
@ali.bayat
یه خط کد که متن رو داخل فایل میزاره و ذخیره میکنه .
و دو خط بالایی

                File::put(public_path("/books/B_" . $content->book_id), $content->content);

$headers = array('Content-Type' => File::mimeType(public_path('/books/B_'.$book->id)) );
            return response()->download(public_path('/books/B_'.$book->id , $headers));

قبلش هم شروطی که لینک رو برسی میکنه که تا خط سوم کد اجرا میشه (خط سوم همین کد ها) خط سوم میترکه.

Alimotreb
Alimotreb
@Alimotreb

تخصص: کانفیگ سرور و برنامه نویس

سلام
@reza159753

اگر میگید توی Public هم باشه نمیتونم دانلود کنم
پس
تنظیمات وب سرور و سطح دسترسی فایل ها باید چک بشه

رضا
رضا
@reza159753

سلام .
@Alimotreb
من بهش دسترسی 777 دادم .
تنظیمات وب سرور مثلا چی رو باید چک کرد ؟

علی بیات
علی بیات
@ali.bayat

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

دو نکته در کد شما دیده میشه.. احتمالا اگر اصلاح کنید مشکل حل بشه

  • ۱ : متد download به شکل زیر باید استفاده بشه:

    return response()->download($pathToFile, $name, $headers);
  • ۲ : به هلپر Public_path در خط سوم دقت کنید.. پرانتزهای این متد در جاهای صحیحی نیستند..

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

    $file_path = public_path("/books/B_" . $content->book_id);
    File::put($file_path, $content->content);
    $headers = array('Content-Type' => File::mimeType($file_path) );
    return response()->download($file_path, $book->id , $headers));
Alimotreb
Alimotreb
@Alimotreb

تخصص: کانفیگ سرور و برنامه نویس

سلام
@reza159753

مواردی رو که جناب بیات گفتند رو تست بگیرید

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

mahdi khanzadi
mahdi khanzadi
@khanzadimahdi

تخصص: Software engineer

میتونستید از پکیج زیر استفاده کنید

https://github.com/shetabit/chunky

از کدی که خودتون نوشتین خیلی بهینه تر هست. میتونید به صورت زیر فایل رو استریم کنید (بفرستید برای دانلود)ّ

namespace App\Http\Controllers;

use App\Models\File;
use Shetabit\Chunky\Classes\StreamOut;

class StreamOutController extends Controller
{
    /**
     * Stream file output
     *
     * @param File $file
     */
    public function __invoke(File $file)
    {
        // procceed until all file has sent to client
        ini_set('max_execution_time', '0');

        // retrieve file's path
        $path = '../'.$file->path; 

        // prepare stream
        $stream = new StreamOut($path);

        // run stream
        $stream->process();
    }
}

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

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