PDA

View Full Version : دانلود فایل از سرور



php_love
جمعه 10 خرداد 1392, 03:06 صبح
سلام دوستان

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

برای دانلود فایل اومدم این کار رو کردم :

تویه سایت لینک مستقیم به فایل رو در اختیار کاربرا قرار دادم , بعد اومدم توسط .htaaccess تمام دانلودها رو redirect کردم به یک صفحه php و بعد اونجا یه سری مسایل رو چک کردم و بعد توسط توابع دسترسی به فایل مثل fopen یا fread فایل رو برای دانلود در اختیار کاربر قرار دادم .

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


ممنون

php_love
جمعه 10 خرداد 1392, 18:28 عصر
دوستان اگه میشه راهنمایی کنید . کارم واجبه .

بی نهایت ممنونم

arta.nasiri
جمعه 10 خرداد 1392, 18:57 عصر
سلام

دوست عزیز کدی که استفاده کردی رو بزار تا بررسی کنیم. در حالت عادی نباید سرعت بیاد پایین

php_love
جمعه 10 خرداد 1392, 19:37 عصر
این تابع رو از سایت آقای کرامتی فر گرفتم . تو پروژم استفاده کردم , اما همانطور که گفتم فکر می کنم به دلیل اینکه حجم فایل ها بالاست (500 الی 1 گیگ) تویه دانلود با مشکل مواجه میشه و با سرعت فوق العاده پایینی دانلود میشه .

لطفا اگه میشه راهنمایی کنید به اینکه چطور می تونم وقتی که کاربر لینک دانلود رو کلیک کرد و من اون رو به وسیله htaccess هدایت کردم به یک صفحه php و در اونجا چک کردم که آیا کاربری که می خواد فایل رو دانلود کنه مجاز هست یا خیر , که اگر کاربر مجاز بود بتونه با سرعت واقعی خودش دانلود کنه .

ممنون




public static function DownloadFile($filename)
{
// place this code inside a php file and call it f.e. "download.php"
// SITE_ROOT is a Constant in Config file for site root path
$path = SITE_ROOT."/files/";
$fullPath = $path.$filename;

if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
// add here more headers for diff. extensions
header("Content-type: application/pdf");
header("Content-Disposition: attachment;
// use 'attachment' to force a download
filename=\"".$path_parts["basename"]."\"");
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".
$path_parts["basename"]."\"");
}
header("Content-length: $fsize");
//use this to open files directly
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;


}

mamali-mohammad
جمعه 10 خرداد 1392, 20:18 عصر
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
اینجا فکر کنم سرعت محدود میشه

php_love
شنبه 11 خرداد 1392, 15:37 عصر
خوب دوست عزیز باید چی کار کنم .
حلقه رو باید بر دارم یا اینکه مقدار عددی که تویه پارامتر دوم تابع fread اومده رو تغییر بدم .


ممنون

Tarragon
شنبه 11 خرداد 1392, 15:51 عصر
سلام
بجاش بزارید :

echo stream_get_contents($fd);
ببینید سرعت بالا تر می ره یا نه؟

mamali-mohammad
شنبه 11 خرداد 1392, 16:05 عصر
نه مقدار عدد رو بیشتر کن

php_love
شنبه 11 خرداد 1392, 19:57 عصر
عزیزان نمیشه حرکته دیگه ای زد که وقتی کاربر رو چک کردم , جوری به فایل مورد درخواستی کاربر واسه دانلود اشاره کنم که انگار کاربر رویه لینک دانلود کلیک کرده . یعنی اینکه با تمام سرعت دانلود کنه . آخه هر کاری کردم با این توابع افت سرعت رو داره .

نمیشه بعد از چک کردن کاربر , مجدد اون رو به همراه مسیر فایل و یک پارامتر خاص به صفحه ای دیگه ارسال کنم و با htaccess بگم اگر اون پارامتر خاص در url وجود داشت , اجازه دسترسی مستقیم به مسیری که ارسال شده رو بده ؟

(شرمنده) نمی دونم متوجه شدید یا نه

mamali-mohammad
شنبه 11 خرداد 1392, 21:00 عصر
از این کد استفاده کن کلا :

$FilePath ='movie/';
$FileName = $link;
$size = filesize($FilePath . $FileName);
header('Cache-control: private');
header("Content-Type: application/force-download;");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ". $size);
header("Content-Disposition: attachment; filename=\"". $FileName ."\";");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
$filedl=fopen($FilePath . $FileName, "r");
fclose($filedl);

Unique
یک شنبه 12 خرداد 1392, 02:29 صبح
یادمه یکبار توی این انجمن موضوع را مطرح کردم ! ولی به هر حال.
راه حل های ارسال فایل با php برای فایل های بزرگ زیاد جالب نیستند و مشکلاتی در بر خواهند داشت ! بهترین کار استفاده از X-Sendfile هست ! در واقع روی apache2 میشه یک ماژول نصب کرد (https://tn123.org/mod_xsendfile/) که وقتی شما header مربوط به X-Sendfile را ارسال کنید ،‌ ارسال فایل دوباره به عهده apache گذاشته میشه و شما کلا بی خیال مشکلات میشین. این ماژول معمولا روی هاست های خوب نصبه و اگه هاستی نداشته باشه با کمی توضیح برای مدیرش قابل نصبه مگه اینکه در پیت باشن (شرکت هاستینگی که این اطلاعات را نداشته باشه باید بره درش را تخته کنه).

راستی توضیحات و تنظیمات مورد نظر توی لینکی که توی خط اول گذاشتم هست.

php_love
یک شنبه 12 خرداد 1392, 16:08 عصر
دوست خوبم لینکی که گذاشتی (توضیحات و تنظیمات ماژول X-Sendfile) مشکل داره , لطفا برسی کنید .

ممنون

Tarragon
یک شنبه 12 خرداد 1392, 17:41 عصر
سلام
لینک درسته mod_xsendfile for Apache2/Apache2.2 (https://tn123.org/mod_xsendfile)