۳ علیرضا دهکار
Download Header in VPS
محسن موحد حل شده توسط محسن موحد

سلام

(عذرخواهی میکنم سوالمو جلسه درستی مطرح نکردم)

من از این کد برای تست دانلود فایل از آدرس مستقیم استفاده میکنم و ی تست انجام دادم در لوکال هاست(کار نکرد) و سرور مجازی(ب جای اینکه فایل رو دانلود کنه یا فایل باز میشه یا ی سری کاراکتر نامفهوم نمایش میده) به همراه نام فایل بین کاراکترها یا ی صفحه سفید نمایش میده اما در هاست لینوکس عملکرد صحیحی داره

https://github.com/TimOliver/PHP-Framework-Classes/blob/master/download.class.php

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

فکر کردم تنظیماتی در سرور یا لوکال هاست داره یا شایدم اکستنشن اما هرچی سرچ کردم هیچکدام نبود

با درخواست‌های هدر،حلقه‌ها و بخش زیادی از کد که قبلا استاد توضیح دادم آشنا هستم مابقی رو متوجه نمیشم 

سلام.

مشکلی نداره روی لوکال.

داخل پارامتر متد download_file نام فایلی که روی سرور محلی قرار داده(remote نیست) و قراره دانلود بشه رو وارد میکنید و constructor هم یک پارامتر dl_filename داره که مشخص میکنه محتوای ارسالی با همچین filename ای ارسال میشه و روی سیستم کاربر ذخیره خواهد شد.

کارشم به این صورته که کل فایلو یکجا نمیخونه، قسمت به قسمت میخونه و جریانی از داده‌های باینری(تکه تکه) توو بافر خروجی چاپ میکنه و به ترتیب برای سرور ارسال میشه.(اون قسمت while)

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

 

محسن موحد ۲۲ فروردین ۱۳۹۹، ۱۱:۵۸

من ی سری تغییرات ایجاد کردم که بشه بصورت ریموت دانلود کرد

این لاین هارو حذف کردم 

//assert the file is valid
if( !is_file( $filename ) )
	throw new Exception( 'Downloader: Could not find file \''.$filename.'\'' );
//make sure it's read-able
if( !is_readable( $filename ) )	
	throw new Exception( 'Downloader: File was unreadable \''.$filename.'\'' );

content type رو به application/force-download تغییر دادم

سایز فایل رو کمی آشنایی داشتم با curl که دریافت میکنم و پاس میدم به هدر اما خب هنگام دانلود نمایش نمیده

بافر فایل رو تکه تکه میکنه؟

اولین بار که اقدام میشه به دانلود:

http://uupload.ir/files/۷u۰h_dlerr.png

دفعات بعدی:

http://uupload.ir/files/oua۵_fghfgh.png

سون لرن قبلا برای دانلود فایل‌های جلسات ی لینک خاص داشت برای هر فایل و آدرس اصلی فایل معلوم نبود چیه که الان اون سیستم رو ندارن من میخوام ی چیزی شبیه به همون رو پیاده سازی کنم 

"" این مشکل برای VPS هست و در لوکال ی فایل بدون حجم دانلود میشه

علیرضا دهکار ۲۲ فروردین ۱۳۹۹، ۱۲:۱۷

من متوجه نشدم دقیقا مشکلتون کجای کار بود چون اسکریپت هم روی VPS و هم روی لوکال، بدرستی کار میکنه.

ولی کلیت کارو میگم تا با سازو کار کدهای این کلاس آشنا بشید.

با تابع get_headers میتونید هدر فایل remote رو بگیرید.(بجای استفاده از curl)

در مورد کد اگه بخوام توضیح کلی بدم مثالم رو روی IDM میگم:

شما آدرس صفحتون رو به IDM میدید مثلا: mysite.com/dl.php

IDM درخواستی به dl.php میفرسته و کدهای داخل اون اجرا میشه و اول constructor کلاس Downloader اجرا میشه و بعد download_file اجرا میشه، هدر‌ها ست میشن و fopen فایل مورد نظرو باز میکنه، وارد if نمیشه(ریکوئست اول HTTP_RANGE وجود نداره و fseek اجرا نمیشه) و مستقیم while اجرا میشه. به اندازه chunksize بایت‌های فایل خونده میشه و در بافر خروجی چاپ میشه(پیش فرض فعاله) و در نهایت flush میشه و هدرها + خروجی به سمت کلایت ارسال میشه.

اگر هنوز استارت هم نکرده باشید، با این چند عمل، سایز فایل روی IDM قابل نمایش هست.(در هدر ست شده)

وقتی IDM استارت میشه، مدام بین سرور و کلاینت رفتو آمد بوجود میاد(تمام کدهای این صفحه مدام خوانده میشود) در رکوئست‌های بعدی HTTP_RANGE وجود داره و زمانی که فایل دانلودی مورد نظر برای بار‌های بعدی باز میشه(fopen)، از طریق fseek مقدار offset رو میگیره و میفهمه از کجای فایل رو بخونه و به سمت خروجی ارسال کنه.

بالا url رو به شکل ساده dl.php مثال زدم ولی در مثال‌های کاربردی مثلا به این شکل url میسازیم:

http://mysite.com/dl.php?filename=anyfileToDownload
OR
http://mysite.com/download/anything
OR
...

تا برای فایل‌های مختلف روی سرور یا حتی فایل های remote لینک‌های متفاوت و حتی زماندار تولید کنیم و دانلود را از داخل سرورمون مدیریت کنیم.

* یه نکته هم روی سرور باید در تنظیمات PHP.ini باید allow_url_fopen = on باشد تا بتونید بصورت remote فایل هارو دانلود کنید.

 

بهترین پاسخ
محسن موحد ۲۲ فروردین ۱۳۹۹، ۱۵:۴۹