PDA

View Full Version : استفاده از دانلودر خود مرورگر



680100
سه شنبه 02 تیر 1394, 10:32 صبح
سلام
روز بخیر

من یه کدی نوشتم که وقتی می خوام فایل رو بخونم دانلود میکنه و این درسته
الان مشکل من اینه با بعضی مرورگرها مشکل دارم و می خوام کاری کنم فقط و فقط از دانلودر خود مرورگر استفاده بشه نه از دانلود منیجر و ...

چه کدی هست که این کار رو انجام میده
ممنون میشم راهنمایی کنید

fatima-php
سه شنبه 02 تیر 1394, 10:58 صبح
کنترل سیستم کلاینت دست شما نیست.

680100
سه شنبه 02 تیر 1394, 11:01 صبح
اما دیدم که شده !

saeedvir
سه شنبه 02 تیر 1394, 17:42 عصر
<?php
// grab the requested file's name
$file_name = $_GET['file'];

// make sure it's a file before doing anything!
if(is_file($file_name)) {

/*
Do any processing you'd like here:
1. Increment a counter
2. Do something with the DB
3. Check user permissions
4. Anything you want!
*/


//check for find in local dir:
$file_in_folder=glob('*.*');
if (in_array($file_name, $file_in_folder)) {
}else{
echo "file not found";
die();
}

$file_info_arr=pathinfo($file_name);

if ($file_info_arr['extension']=='txt' || $file_info_arr['extension']=='xls') {
//if body
}else{
echo "file error";
die();
}



// required for IE
if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); }

// get the file mime type using the file extension
switch(strtolower(substr(strrchr($file_name, '.'), 1))) {
case 'pdf': $mime = 'application/pdf'; break;
case 'zip': $mime = 'application/zip'; break;
case 'jpeg':
case 'jpg': $mime = 'image/jpg'; break;
default: $mime = 'application/force-download';
}
header('Pragma: public'); // required
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($file_name)).' GMT');
header('Cache-Control: private',false);
header('Content-Type: '.$mime);
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file_name)); // provide file size
header('Connection: close');
readfile($file_name); // push it out
exit();

}else{
die('file error');
}
?>

680100
سه شنبه 02 تیر 1394, 17:47 عصر
ممنون
میشه کاری کرد فقط یک کانکشن وصل بشه ؟

برای مثال دانلود منیجر در زمان دانلود 8 تا 32 تا ... می تونه کانکشن درست کنه در زمان دانلود .
یعنی کاری به اگر حتی دانلود منیجر روی 32 کانکشن باشه فقط بتونه از یک کانکشن دانلود کنه

680100
شنبه 06 تیر 1394, 09:27 صبح
کسی نبود این کد رو توسعه بده ؟

arta.nasiri
شنبه 06 تیر 1394, 14:14 عصر
سلام

میشه بپرسم دلیل اینکه نمیخواهید کاربر بتونه با دانلود منیجر دانلود کنه چیه؟
php نمیتونه تعداد کانکشن ها رو محدود کنه باید از web server خودتون کمک بگیرید.

البته روشهایی تو php هست که میشه محدود کرد. مثل ذخیره کردن ip در دیتابیس و بررسی اون با هر بار اجرای تابع دانلود فایل ولی روش ۱۰۰٪ نیست.

680100
شنبه 06 تیر 1394, 14:27 عصر
دلیل این کار

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

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

ولی با نرم افزار های دانلود که چند کانکشن دارند دچار مشکل میشه ، یعنی به تعداد کانکشن شماره میندازه .

برای مثال یک فایل که 0 دانلود داشته

اگر با دانلودر خود مرورگر دانلود بشه میشه 1 و تمام ولی اگر با نرم افزار دانلود ، دانلود بشه به تعداد کانکشن شماره میندازه 2 یا 3 یا 8 یا ... میندازه !!

دلیل این کارم این هست که شمارش دقیق باشه

یک نمونه آنلاین هم این سایت داره !!

http://shootfile.ir

یک فایل مثلا 3 مگابایتی آپلود کن سپس دانلود کن تعداد دانلود دقیق نیستند

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

2undercover
شنبه 06 تیر 1394, 15:28 عصر
می تونید در آدرس دانلود یک کد یکتا قرار بدید و بعد در سمت سرور وقتی درخواست برای دانلود اومد شما اون کد یکتا رو توی پایگاه داده ذخیره کنید و بعد هم اگر دوباره یک کانکشن جدید اون آدرس رو درخواست کرد می تونید توی پایگاه داده بررسی کنید که اگر اون کد یکتا قبلا توسط یک کانکشن دیگه استفاده شده بود بهش اجازه ندید فایل رو دانلود بکنه. اینجوری فقط یک کانکشن می تونه درخواست دانلود بده. برای این هم که در ادامه دانلود به مشکل بر نخورید می تونید وقتی کاربر دانلود رو متوقف کرد اون کد یکتا رو در پایگاه داده حذف کنید تا کاربر وقتی ادامه دانلود رو زد با مشکل مواجه نشه.

680100
شنبه 06 تیر 1394, 17:35 عصر
می تونید در آدرس دانلود یک کد یکتا قرار بدید و بعد در سمت سرور وقتی درخواست برای دانلود اومد شما اون کد یکتا رو توی پایگاه داده ذخیره کنید و بعد هم اگر دوباره یک کانکشن جدید اون آدرس رو درخواست کرد می تونید توی پایگاه داده بررسی کنید که اگر اون کد یکتا قبلا توسط یک کانکشن دیگه استفاده شده بود بهش اجازه ندید فایل رو دانلود بکنه. اینجوری فقط یک کانکشن می تونه درخواست دانلود بده. برای این هم که در ادامه دانلود به مشکل بر نخورید می تونید وقتی کاربر دانلود رو متوقف کرد اون کد یکتا رو در پایگاه داده حذف کنید تا کاربر وقتی ادامه دانلود رو زد با مشکل مواجه نشه.


ممنون ولی متوجه نشدم !
اینجاش رو متوجه هستم که وقت دانلود یه لینک بده که تا زمانی که stop کرده اون لینک پایدار باشه
اینش رو موجه نشدم که چطور تشخیص بده stop کرده ؟ یا می خواد ادامه دانلود رو انجام بده ؟

2undercover
شنبه 06 تیر 1394, 19:17 عصر
ممنون ولی متوجه نشدم !
اینجاش رو متوجه هستم که وقت دانلود یه لینک بده که تا زمانی که stop کرده اون لینک پایدار باشه
اینش رو موجه نشدم که چطور تشخیص بده stop کرده ؟ یا می خواد ادامه دانلود رو انجام بده ؟

خوب شما در انتهای هر لینک دانلود یک کد یکتا اضافه می کنید و اون رو توی Session ذخیره می کنید؛ مثلا لینک دانلود شما به این شکل در میاد:


<a href="http://test.ir/download.php?name=filename.zip&token=UNIQUE_TOKEN"></a>

که UNIQUE_TOKEN اون کد یکتا هست.

بعد توی صفحه ای که فایل رو برای دانلود به کاربر می فرسته (در مثال بالا صفحه download.php)، اول بررسی می کنید که اون کد یکتا که در آدرس وجود داره با اونی که توی Session ذخیره کردید یکی هست یا نه، اگر بود اول بررسی می کنید که وضعیت اون کد یکتا توی پایگاه داده چطوره، آیا اون کد یکتا در پایگاه داده وجود داره یا نه، اگر وجود داشت بررسی می کنید که وضعیتش چیه، در حال دانلود یا متوقف شده، اگر که در حال دانلود بود به این معنی هست که یک کانکشن در حال دانلود اون فایل هست پس می تونید از برنامه خارج بشید تا به بقیه ی کانکشن ها اجازه دانلود ندید، اگر اون کد در پایگاه داده وجود نداشت اون کد یکتا رو وارد پایگاه داده می کنید و وضعیتش رو در حال دانلود قرار می دید؛ مثلا به شکل زیر:


INSERT INTO `download_tokens`(`token`, `status`) VALUES ('UNIQUE_TOKEN', 'downloading')


برای این هم که توی اون صفحه download.php متوجه بشید که کاربر دانلود رو متوقف کرده تا وضعیت اون کد رو توی پایگاه داده به حالت متوقف شده در بیارید می تونید از تابع های ignore_user_abort و connection_aborted استفاده کنید (تابع register_shutdown_function هم هست) و وقتی فهمیدید که کاربر دانلود رو متوقف کرده حالت کد یکتا در پایگاه داده رو به متوقف شده تغییر می دید تا کاربر بتونه بعدا دوباره به ادامه دانلود بپردازه.

این لینک هم تازه پیداش کردم چیز خوبیه: http://stackoverflow.com/questions/8248982/how-to-limit-connections-for-user

arta.nasiri
شنبه 06 تیر 1394, 22:11 عصر
سلام
هم میتونید از روشی که دوستان فرمودند استفاده کنید هم میتونید قبل از ارسال فایل به client مقدار هدر HTTP_RANGE رو چک کنید اگه بیشتر از صفر بایت بود یعنی مقداری از این فایل قبلا توسط client دانلود شده و نباید در شمارش تعداد دانلودها لحاظ بشه. اینجوری هرچند تا کانکشن هم ایجاد بشه فقط یک دانلود بحساب میاد.

$_SERVER['HTTP_RANGE']