vahidahmad
5 سال پیش توسط vahidahmad مطرح شد
22 پاسخ

خرید آنلاین فایل های حجیم

سلام دوستان، وقت بخیر

🌟🌟 شرح خلاصه:
چطور میشه لینک اختصاصی برای دانلود یک فایل با حجم بالا حدود یک گیگ تولید کنم ، این کارو با لاراول انجام میدم ولی تمام رم اشغال میشه و سایت بالا نمیاد

🌟🌟 شرح کامل:
یه پروژه دارم انجام میدم که قراره در اون فایل های با حجم زیاد به فروش برسه، حدود یک گیگ، به کمک Laravel Signed Url میام محدودیت زمانی میذارم برای لینک دانلود و یه لینک اختصاصی برای کسی که فایل رو خریده تولید میکنم

موقعی که لینک دانلود کلیک میشه ، این تابع اجرا میشه :

        if (!request()->hasValidSignature()) {
            abort(۴۰۴);
        }
        $file = File::findOrFail($id);
        return response()->download($file->path);

فایل شروع میشه به دانلود شدن ولی مشکل اینه که این روش ظاهرا برای فایلهای بزرگ خوب نیست چون لاراول همه فایل رو میریزه توی رم برای ساخت response

تست زدم، وقتی فایل میخواد شروع بشه به دانلود، حدود یک دقیقه سایت اصلا بالا نمیاد!!

روش های دیگه ای هم هست مثل response->stream ولی با این روش دانلود فایل قابل resume نیست


ثبت پرسش جدید
mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 5 سال پیش آپدیت شد
4

سلام پکیج زیر رو نصب کنید:

composer require shetabit/chunky

حالا فایل رو استریم کنید (مولتی چانک و قابل رزیوم هست) :

<?php

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)
    {
        $path = '../'.$file->path;

        $stream = new StreamOut($path);

        $stream->process();
    }
}

خود پکیج وظیفه کنترل چانک ها رو به عهده میگیره و میتونید مولتی چانک به صورت همزمان نیز دانلود رو با IDM انجام بدید. نیازمند هاست یا سرور جداگانه هم نیستین.


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
2

سلام
@vahidahmad

شما باید برای فایل ها ، حالا چه حجیم چه غیر حجیم ، لینک دانلود از جای دیگه بدید
فایل رو بریزید توی سرور دیگه یا هاست دانلود
لینک مستقیمش و با لاراول محدودیت روش اعمال کنید محدود آیپی و زمان و ....
از خود لاراول بخواد این کار انجام شه ، معلومه رم فول میشه.


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

ممنون @Alimotreb از پاسختون، مشکل من دقیقا همینه، باید روی لینک مستقیم محدودیت اعمال کنم ، ولی چطور؟

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


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 5 سال پیش آپدیت شد
4

سلام پکیج زیر رو نصب کنید:

composer require shetabit/chunky

حالا فایل رو استریم کنید (مولتی چانک و قابل رزیوم هست) :

<?php

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)
    {
        $path = '../'.$file->path;

        $stream = new StreamOut($path);

        $stream->process();
    }
}

خود پکیج وظیفه کنترل چانک ها رو به عهده میگیره و میتونید مولتی چانک به صورت همزمان نیز دانلود رو با IDM انجام بدید. نیازمند هاست یا سرور جداگانه هم نیستین.


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

سلام جناب خانزادی عزیز، پکیجتون بسیار عالی کار میکنه، دم شما گرم @khanzadimahdi


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
2

سلام
@vahidahmad

محبت میکنید یه عکس از خروجی که توی IDM داره دانلود میشه اسکرین بزارید
ببینیم چطوری کار میکنه این پکیج .


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
0

سلام
@vahidahmad

تشکر ، این دانلود از استوریج لاراولتون هست؟


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

@Alimotreb
نه از پوشه پابلیک، فک نمیکنم تفاوتی داشته باشه


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

@khanzadimahdi
جناب خانزادی ، یه مشکلی هست موقع دانلود با این پکیج، ابتدای کار که شروع میشه، idm نشون نمیده که قابل resume هست، و اینکه بعد از اینکه کنسل میکنم دانلود رو و دوباره دکمه resume رو میزنم پیغام خطا میاد:
Connection has been closed by server


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 5 سال پیش آپدیت شد
1

@vahidahmad
سلام. مشکل رو بررسی و رفع میکنم امروز و همینجا اطلاع میدم بهتون . مرسی از اطلاع دادنتون.


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

@khanzadimahdi
ممنون از توجه شما، اگر تمایل داشتید میتونید مشکل رو روی سرور خودم بررسی و تست کنید، از طریق اسکایپ یا ...

09158352060
روی این شماره تلگرام و واتساپ دارم


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

@khanzadimahdi
درضمن من این موضوع رو در استک هم مطرح کردم، خیلی عجیبه که هرچی جستجو زدم پکیج یا روش درست و حسابی پیدا نکردم و کسی هم پاسخی نداده

https://stackoverflow.com/q/57550571/5458806


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

@Alimotreb

این پکیج ظاهرا ایراداتی داره، اول که استفاده کردم رزوم میکرد ولی الان نمیدونم چش شده!

لطفا اگه راهی به ذهنت میرسه که حتی در هاست اشتراکی ، از فایل محافظت کرد ، راهنماییم کن، به نظرم خیلی چیز بدیهی هستش، اصلا فک نمیکردم توی یه همچین چیزی به مشکل بخورم !! هرچی سرچ میزنم هیچی پیدا نمیشه


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
0

سلام
@vahidahmad

عمدتا روی اکثر کانکشن هایی که روی سرور زده میشه ، شما وقتی درخواستی برای دانلود میفرستید
به فرض فایل 10 مگه یا 100 مگه
بزارید یه 10 ثانیه ، که اینم بسته به نت شما داره ، تا اتصال کامل کانکشن ها بر قرار شه
بعد ببینید میتونید pause کنید یا خیر


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

@Alimotreb
بله متوجه هستم،

خب بلاخره نگفتید راهی میدونید برای محافظت از لینک های مستقیم ؟


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
0

سلام
@vahidahmad

بالاخره رو که همون اول بهتون گفتم
کلی روش برای محدود کردن یه لینک مستقیم هست ، اگر اینجا از من کدش رو میخوایید که اینجا کد قرار نمیگیره کد توی پروژه باید دیده بشه و سنجیده بشه!

توی گوگل برید سرچی کنید احتمالا باید باشه

توی همین سایت راکت هم احتمالا توضیحاتی راجبش داده شده :
https://roocket.ir/series/build-an-educational-website-and-shop-with-laravel/episode/40

https://roocket.ir/series/download-a-file-system-against-payment-with-laravel

با زمان میشه ، با آیپی میشه ، با توکن میشه ، با اسم فایل میشه ، با کلی چیزا هم میشه محدود کرد ، هم میشه کاری کرد که طرف نفهمه فایل اصلی کجاست و چطوریه !


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

@khanzadimahdi

پکیج خوبی نوشتید.. کاربردی و سادست
پیروز باشید


vahidahmad
تخصص : برنامه نویس فول استک
@vahidahmad 5 سال پیش مطرح شد
0

@Alimotreb
علی عزیز، معلوم میشه همون اول اصلا سوال من رو نخوندید!! این سوال رو توی استک هم پرسیدم ولی متاسفانه کسی پاسخ نداده هنوز:
https://stackoverflow.com/q/57550571/5458806

من هر دو دوره ای که معرفی کردید رو دیدم، و میدونم که با استفاده از تابع response لاراول میشه راحت فایل رو به صورت دانلود فرستاد سمت کلاینت، بدون لو رفتن لینک مستقیم، ولی مشکل این روش اینه که اصلا برای فایل های بزرگ کاربرد نداره، بارها تست زدم، رم سرور اشتراکی رو به صورت کامل میگیره، (فایل دانلودی یک گیگی)، و حدود یک دقیقه سایت اصلا بالا نمیاد، این جواب رو مطالعه کنید ، تایید کننده حرف بنده هستش:
https://stackoverflow.com/a/15945626/5458806

میدونم چطور میشه یک لینک زمان دار امن ساخت، مهم همون مرحله آخره که فایل حجیم رو چطور بدیم به کاربر.

سایت های معروفی مثل فرین مدیا، رو تست زدم، کاری که میکنن اینه که بعد از پرداخت کاربر، یه کپی از فایل تهیه میکنن و تا یه هفته نگه میدارن، احتمالا بعد از یک هفته فایل با استفاده از کران جاب پاک میشه، ولی این برای یه هاست اشتراکی کاربردی نیست.

@hesammousavi
این سوال رو از جناب موسوی عزیز هم پرسیدم در قسمت کامنت های دوره فروش فایل با لاراول ولی پاسخ ندادند

این پکیجی هم که استفاده کردم به این دلیل خوبه که فایل رو قطعه قطعه میکنه و به صورت استریم میفرسته، اما متاسفانه ایراداتی داره و قابل رزوم نیست

@khanzadimahdi
آقای بیات عزیز، شما هم اگه تجربه ای در زمینه دانلود فایلهای خیلی بزرگ دارید ممنون میشم یه راهنمایی کنید یا سر نخی بدید :)


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 5 سال پیش مطرح شد
2

@vahidahmad

سلام دانلود رو چک کردم به درستی کار میکنه. مولتی پارت و قابل رزیوم هست.
علت بسته شدن کانکشن از سرور به دلیل max_execution_time هست. مدت زمان استریم بیشتر از ۳۰ ثانیه طول میکشه و سرور درخواست رو میبنده. برای ادامه استریم تا انتهای کار باید دستور زیر رو قبل از شروع استریم قرار بدید:

ini_set('max_execution_time', '0'); // for infinite time of execution 

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

<?php

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)
    {

        ini_set('max_execution_time', '0'); // for infinite time of execution 

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

        $stream = new StreamOut($path);

        $stream->process();
    }
}

حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

سلام میتونید از تابع streamDownload که در خود لاراول قرار داره استفاده کنید.
https://laravel.com/docs/5.8/responses#file-downloads


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

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