مرکز پرسش و پاسخ

سوالات خود را در این بخش مطرح کنید








کانال رسمی ما در تلگرام

MiladWorkShop_IR را در تلگرام دنبال کنید


ناحیه کاربری

ثبت نام   بازیابی کلمه عبور

تماس با من

به منظور دریافت مشاوره یا سفارش برنامه نویسی انواع پروژه یا اطلاع از شرایط تدریس خصوصی برنامه نویسی تحت وب PHP به صورت پروژه محور میتونید از طریق یکی از راه های زیر با بنده ارتباط برقرار کنید.
  09304443004
  @miladworkshop
  info@miladworkshop.ir
ایجاد لینک دانلود غیر مستقیم با PHP

خیلی وقتا برام پیش آمده که میخوام یه فایل رو برای دانلود بزارم ولی طوری که کسی نتونه آدرس مستقیم فایلم رو پیدا کنه. این ترفند برای مواقعی به کار میره که بنا به هر دلیلی دوس ندارید آدرس واقعی فایلتون نمایش داده بشه. در اینجا چند روش برای این کار رو بهتون نشون میدم:
روش کلی برای ایجاد لینک های دانلود غیر مستقیم با استفاده از PHP به این صورت هست که محتوای فایل رو توی صفحه echo میکنیم. به کد زیر توجه کنید:

//our download function
function download_file($file)
{
	set_time_limit(-1);
	if(file_exists($file))
	{
		header("Pragma: public");
		header("Expires: 0");
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
		header("Cache-Control: public");
		header("Content-Description: File Transfer");
		header("Content-type: application/octet-stream");
		header("Content-Disposition: attachment; filename="".basename($file).""");
		header("Content-Transfer-Encoding: binary");
		header("Content-Length: ".filesize($file));
		@readfile($file);
		flush();
	}else{
		//if file not exists send 404 not found
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
		exit();
	}
}
 
//run our download function
download_file('1.mp3');

در کدهای بالا ابتدا یه تابع تعریف کردم که وظیفه ی فرستادن فایل به دانلود رو به عهده داره. نحوه کار به این صورته که آدرس فایل رو به تابع میدیم و فایل برای دانلود ارسال میشه. اگه فایل بنا به هر دلایلی وجود نداشته باشه با صفحه ۴۰۴ مواجه خواهید شد. در این روش کل فایل رو به صورت یکجا به خروجی فرستادم تا کاربر بتونه عمل دانلود رو انجام بده. این روش یه ایرادی داره و ایرادش این هست که در هنگام ارسال فایل های بزرگ به سمت کاربر با مشکل منابع رم رو به رو خواهید شد. خب ما برای اینکه بتونیم برای فایل های حجیم لینک دانلود غیر مستقیم ایجاد کنیم میتونیم فایل رو تیکه تیکه به خروجی بفرستیم. همچنین میتونیم سرعت دانلود رو هم برای فایل محدود کنیم. به مثال زیر دقت کنید:

//our download function
function download_file($file,$speed)
{
	set_time_limit(-1);
	if(file_exists($file))
	{
		header("Pragma: public");
		header("Expires: 0");
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
		header("Cache-Control: public");
		header("Content-Description: File Transfer");
		header("Content-type: application/octet-stream");
		header("Content-Disposition: attachment; filename="".basename($file).""");
		header("Content-Transfer-Encoding: binary");
		header("Content-Length: ".filesize($file));
		$fcon=fopen($file,"r");
		$speed*=1024; //speed in KB
		while(!feof($fcon)) {
			echo fread($fcon,$speed);
			sleep(1);
			flush();
		}
		fclose($fcon);
	} else {
		//if file not exists send 404 not found
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
		exit();
	}
}
 
//run our download function
download_file('1.mp3',100);

یه تابع تعریف کردم که دوتا پارامتر میگیره. پارامتر اول آدرس فایل و پارامتر دوم سرعت دانلود به کیلوبایت خواهد بود. توی این تابع فایل رو به صورت تیکه تیکه برای دانلود به خروجی میفرستم و اندازه ی هر تیکه از فایل رو با متغییر speed تعیین میکنم. این متغییر مشخص میکنه که توی هر ثانیه چه مقداری از فایل به خروجی فرستاده بشه. مثلا اگه توی هر ثانیه ۱۰۰ کیلوبایت برای دانلود به خروجی فرستاده بشه سرعت دانلود ما برابر با ۱۰۰kb/s خواهد بود. برای ایجاد وقفه زمانی بین ارسال تیکه های فایل از دستور sleep استفاده کردم که زمان رو بر حسب ثانیه بهش میدیم و توی اون مدت زمان عمل وقفه رو انجام میده.


   20488 بازدید
   وبلاگ, آموزش, دانلود, php
  دانلود, مخفی کردن لینک, دانلود غیر مستقیم, دانلود از طریق php