سلام دوستان، وقت بخیر
🌟🌟 شرح خلاصه:
چطور میشه لینک اختصاصی برای دانلود یک فایل با حجم بالا حدود یک گیگ تولید کنم ، این کارو با لاراول انجام میدم ولی تمام رم اشغال میشه و سایت بالا نمیاد
🌟🌟 شرح کامل:
یه پروژه دارم انجام میدم که قراره در اون فایل های با حجم زیاد به فروش برسه، حدود یک گیگ، به کمک Laravel Signed Url میام محدودیت زمانی میذارم برای لینک دانلود و یه لینک اختصاصی برای کسی که فایل رو خریده تولید میکنم
موقعی که لینک دانلود کلیک میشه ، این تابع اجرا میشه :
if (!request()->hasValidSignature()) {
abort(۴۰۴);
}
$file = File::findOrFail($id);
return response()->download($file->path);
فایل شروع میشه به دانلود شدن ولی مشکل اینه که این روش ظاهرا برای فایلهای بزرگ خوب نیست چون لاراول همه فایل رو میریزه توی رم برای ساخت response
تست زدم، وقتی فایل میخواد شروع بشه به دانلود، حدود یک دقیقه سایت اصلا بالا نمیاد!!
روش های دیگه ای هم هست مثل response->stream ولی با این روش دانلود فایل قابل resume نیست
سلام پکیج زیر رو نصب کنید:
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
شما باید برای فایل ها ، حالا چه حجیم چه غیر حجیم ، لینک دانلود از جای دیگه بدید
فایل رو بریزید توی سرور دیگه یا هاست دانلود
لینک مستقیمش و با لاراول محدودیت روش اعمال کنید محدود آیپی و زمان و ....
از خود لاراول بخواد این کار انجام شه ، معلومه رم فول میشه.
ممنون @Alimotreb از پاسختون، مشکل من دقیقا همینه، باید روی لینک مستقیم محدودیت اعمال کنم ، ولی چطور؟
یعنی کاربر لینک مستقیم رو میبینه ولی اگه مستقیم بدون پارامتر های مورد نیاز لینک رو بزنه دانلود نمیشه... چطوری باید این کارو بکنم ؟ لطفا یه نمونه کد بگید، ممنون
سلام پکیج زیر رو نصب کنید:
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
محبت میکنید یه عکس از خروجی که توی IDM داره دانلود میشه اسکرین بزارید
ببینیم چطوری کار میکنه این پکیج .
@khanzadimahdi
جناب خانزادی ، یه مشکلی هست موقع دانلود با این پکیج، ابتدای کار که شروع میشه، idm نشون نمیده که قابل resume هست، و اینکه بعد از اینکه کنسل میکنم دانلود رو و دوباره دکمه resume رو میزنم پیغام خطا میاد:
Connection has been closed by server
@vahidahmad
سلام. مشکل رو بررسی و رفع میکنم امروز و همینجا اطلاع میدم بهتون . مرسی از اطلاع دادنتون.
@khanzadimahdi
ممنون از توجه شما، اگر تمایل داشتید میتونید مشکل رو روی سرور خودم بررسی و تست کنید، از طریق اسکایپ یا ...
09158352060
روی این شماره تلگرام و واتساپ دارم
@khanzadimahdi
درضمن من این موضوع رو در استک هم مطرح کردم، خیلی عجیبه که هرچی جستجو زدم پکیج یا روش درست و حسابی پیدا نکردم و کسی هم پاسخی نداده
این پکیج ظاهرا ایراداتی داره، اول که استفاده کردم رزوم میکرد ولی الان نمیدونم چش شده!
لطفا اگه راهی به ذهنت میرسه که حتی در هاست اشتراکی ، از فایل محافظت کرد ، راهنماییم کن، به نظرم خیلی چیز بدیهی هستش، اصلا فک نمیکردم توی یه همچین چیزی به مشکل بخورم !! هرچی سرچ میزنم هیچی پیدا نمیشه
سلام
@vahidahmad
عمدتا روی اکثر کانکشن هایی که روی سرور زده میشه ، شما وقتی درخواستی برای دانلود میفرستید
به فرض فایل 10 مگه یا 100 مگه
بزارید یه 10 ثانیه ، که اینم بسته به نت شما داره ، تا اتصال کامل کانکشن ها بر قرار شه
بعد ببینید میتونید pause کنید یا خیر
@Alimotreb
بله متوجه هستم،
خب بلاخره نگفتید راهی میدونید برای محافظت از لینک های مستقیم ؟
سلام
@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
با زمان میشه ، با آیپی میشه ، با توکن میشه ، با اسم فایل میشه ، با کلی چیزا هم میشه محدود کرد ، هم میشه کاری کرد که طرف نفهمه فایل اصلی کجاست و چطوریه !
@Alimotreb
علی عزیز، معلوم میشه همون اول اصلا سوال من رو نخوندید!! این سوال رو توی استک هم پرسیدم ولی متاسفانه کسی پاسخ نداده هنوز:
https://stackoverflow.com/q/57550571/5458806
من هر دو دوره ای که معرفی کردید رو دیدم، و میدونم که با استفاده از تابع response لاراول میشه راحت فایل رو به صورت دانلود فرستاد سمت کلاینت، بدون لو رفتن لینک مستقیم، ولی مشکل این روش اینه که اصلا برای فایل های بزرگ کاربرد نداره، بارها تست زدم، رم سرور اشتراکی رو به صورت کامل میگیره، (فایل دانلودی یک گیگی)، و حدود یک دقیقه سایت اصلا بالا نمیاد، این جواب رو مطالعه کنید ، تایید کننده حرف بنده هستش:
https://stackoverflow.com/a/15945626/5458806
میدونم چطور میشه یک لینک زمان دار امن ساخت، مهم همون مرحله آخره که فایل حجیم رو چطور بدیم به کاربر.
سایت های معروفی مثل فرین مدیا، رو تست زدم، کاری که میکنن اینه که بعد از پرداخت کاربر، یه کپی از فایل تهیه میکنن و تا یه هفته نگه میدارن، احتمالا بعد از یک هفته فایل با استفاده از کران جاب پاک میشه، ولی این برای یه هاست اشتراکی کاربردی نیست.
@hesammousavi
این سوال رو از جناب موسوی عزیز هم پرسیدم در قسمت کامنت های دوره فروش فایل با لاراول ولی پاسخ ندادند
این پکیجی هم که استفاده کردم به این دلیل خوبه که فایل رو قطعه قطعه میکنه و به صورت استریم میفرسته، اما متاسفانه ایراداتی داره و قابل رزوم نیست
@khanzadimahdi
آقای بیات عزیز، شما هم اگه تجربه ای در زمینه دانلود فایلهای خیلی بزرگ دارید ممنون میشم یه راهنمایی کنید یا سر نخی بدید :)
سلام دانلود رو چک کردم به درستی کار میکنه. مولتی پارت و قابل رزیوم هست.
علت بسته شدن کانکشن از سرور به دلیل 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();
}
}
سلام میتونید از تابع streamDownload که در خود لاراول قرار داره استفاده کنید.
https://laravel.com/docs/5.8/responses#file-downloads
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟