ایجاد لینک دانلود غیرمستقیم فایل با php
اگر شما هم فایلهایی را برای دانلود در سایت خود دارید و نیاز دارید که این فایلها فاقد لینک دانلود مستقیم شوند و لینک غیرمستقیم را به کاربران خود بدهید به گونهای که نتوانند با قرار دادن آن لینک در جایی آن فایلها را به سادگی بقیه دانلود کنند این آموزش را ببنید. دقت کنید که اگر سایت شما سایت فروش فایل است یا سایت دانلود فایلهای مهم است حتما این چالش و این موضوع برای شما پر اهمیت است. دقت کنید در این آموزش با کمک زبان برنامه نویسی PHP به شما نحوهی ایجاد لینک دانلود غیر مستقیم فایلها را آموزش میدهیم.
ایجاد لینک دانلود غیرمستقیم فایل با php
شما نیاز به دو فایل اصلی php دارید:
- فایل download.php
- فایل link.php
فایل download.php
کد زیر را در این فایل وارد کنید و آنرا در هاست خود آپلود کنید:
<?php class ResumeDownload { private $file; private $name; private $boundary; private $delay = 0; private $size = 0; function __construct($file, $delay = 0) { if (! is_file($file)) { header("HTTP/1.1 400 Invalid Request"); die("<h3>File Not Found</h3>"); } $this->size = filesize($file); $this->file = fopen($file, "r"); $this->boundary = md5($file); $this->delay = $delay; $this->name = basename($file); } public function process() { $ranges = NULL; $t = 0; if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_SERVER['HTTP_RANGE']) && $range = stristr(trim($_SERVER['HTTP_RANGE']), 'bytes=')) { $range = substr($range, 6); $ranges = explode(',', $range); $t = count($ranges); } header("Accept-Ranges: bytes"); header("Content-Type: application/octet-stream"); header("Content-Transfer-Encoding: binary"); header(sprintf('Content-Disposition: attachment; filename="%s"', $this->name)); if ($t > 0) { header("HTTP/1.1 206 Partial content"); $t === 1 ? $this->pushSingle($range) : $this->pushMulti($ranges); } else { header("Content-Length: " . $this->size); $this->readFile(); } flush(); } private function pushSingle($range) { $start = $end = 0; $this->getRange($range, $start, $end); header("Content-Length: " . ($end - $start + 1)); header(sprintf("Content-Range: bytes %d-%d/%d", $start, $end, $this->size)); fseek($this->file, $start); $this->readBuffer($end - $start + 1); $this->readFile(); } private function pushMulti($ranges) { $length = $start = $end = 0; $output = ""; $tl = "Content-type: application/octet-stream\r\n"; $formatRange = "Content-range: bytes %d-%d/%d\r\n\r\n"; foreach ( $ranges as $range ) { $this->getRange($range, $start, $end); $length += strlen("\r\n--$this->boundary\r\n"); $length += strlen($tl); $length += strlen(sprintf($formatRange, $start, $end, $this->size)); $length += $end - $start + 1; } $length += strlen("\r\n--$this->boundary--\r\n"); header("Content-Length: $length"); header("Content-Type: multipart/x-byteranges; boundary=$this->boundary"); foreach ( $ranges as $range ) { $this->getRange($range, $start, $end); echo "\r\n--$this->boundary\r\n"; echo $tl; echo sprintf($formatRange, $start, $end, $this->size); fseek($this->file, $start); $this->readBuffer($end - $start + 1); } echo "\r\n--$this->boundary--\r\n"; } private function getRange($range, &$start, &$end) { list($start, $end) = explode('-', $range); $fileSize = $this->size; if ($start == '') { $tmp = $end; $end = $fileSize - 1; $start = $fileSize - $tmp; if ($start < 0) $start = 0; } else { if ($end == '' || $end > $fileSize - 1) $end = $fileSize - 1; } if ($start > $end) { header("Status: 416 Requested range not satisfiable"); header("Content-Range: */" . $fileSize); exit(); } return array( $start, $end ); } private function readFile() { while ( ! feof($this->file) ) { echo fgets($this->file); flush(); usleep($this->delay); } } private function readBuffer($bytes, $size = 1024) { $bytesLeft = $bytes; while ( $bytesLeft > 0 && ! feof($this->file) ) { $bytesLeft > $size ? $bytesRead = $size : $bytesRead = $bytesLeft; $bytesLeft -= $bytesRead; echo fread($this->file, $bytesRead); flush(); usleep($this->delay); } } } $file = $_GET['f']; $code = $_GET['c']; $ip = $_SERVER['REMOTE_ADDR']; $file = ltrim(rtrim($file)); $file = strip_tags($file); $file = filter_var($file, FILTER_SANITIZE_STRING); $code = ltrim(rtrim($code)); $code = strip_tags($code); $code = filter_var($code, FILTER_SANITIZE_STRING); if ($code != md5(str_replace(".", "", $ip))) { die('authentication denied'); } $file = 'download/' . $file; if (!file_exists($file)) { die('The file $file does not exist'); } set_time_limit(0); $download = new ResumeDownload($file, 1); //delay about in microsecs $download->process(); ?>
فایل link.php
<?php $pathinfo = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : $_SERVER['REDIRECT_URL']; $params = preg_split('|/|', $pathinfo, -1, PREG_SPLIT_NO_EMPTY); $file = ltrim(rtrim($params[0])); $file = strip_tags($file); $file = filter_var($file, FILTER_SANITIZE_STRING); if(empty($file) || is_null($file)) { header("location:https://domain.com/"); die(); } $link = md5(str_replace(".", "", $_SERVER['REMOTE_ADDR'])); header("location:https://domain.com/download.php?f=" . $file . "&c=" . $link); die(); ?>
حالا یک پوشه با نام download بسازید و فایلهای خود را درون آن قرار دهید؛ از حالا هر لینکی با آدرس زیر را برای کاربران خود ارسال کنید به صورت غیر مستقیم تنها برای همان کاربران قابل دانلود است:
https://domain.com/link.php/file.rar
تنظیمات htaccess
<IfModule mod_rewrite.c> RewriteEngine On # Redirect Trailing Slashes... RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
اگر تمامی موارد بالا را به درستی انجام دهید باید این سیستم کوچک کار بکند و شما نیاز نیست لینک مستقیم فایلها را در سایت خود استفاده کنید و نترسید که کاربران شما لینک خود را به دیگران بدهند. دقت کنید اگر کد فایل download.php کمی طولانی است و نسبت به کدهای مشابه بیشتر است علت آن این است که با کمک این کد لینک دانلودهای شما سریع و قابل resume شدن خواهند شد.
اگر مشکلی در استفاده از کدهای بالا دارید در بخش نظرات برای ما بنویسید؛ این کد و ترفند کاملا اختصاصی انجام شده است و در صورتی که این کدها را در سایت خود منتشر کردید لطفا لینک منبع را نیز ذکر کنید.
سلام و ممنون
من در هاست دانلودم این کار رو کردم و اوکی بود.
اگه بخوام برای همه فایل ها در هاست دانلود این کار رو انجام بدم چطوری؟
چون فایل ها در فولدر و مسیر های مختلف در هاست دانلود هستند
باید اسکریپت ها را در مسیر اصلی و قبلی فولدرها قرار دهید و سپس نسبت به آن آدرس دهی ها را انجام دهید
سلام خسته نباشید. ممنون از کدی که قرار دادین. مشکل اینکه لینک اصلی رو نمایان نمیکنه حل شد ولی وقتی کاربر لینک رو کپی میکنه و در اختیار شخص دیگه ای قرار میده برای فرد مینویسه شما اجازه دسترسی ندارید اما در عین حال دانلود انجام میشه! ممنون میشم راهنمایی کنید.
مورد دیگه اینکه اگر هاست دانلودمون از سایت جدا باشه اونوقت چطور؟
ما روی هاست های مجزا این کار رو کردیم
من در هاست دانلود خودم استفاده کردم ارور میده
Not Found
The requested URL was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
مشکلی در تنظیمات htaccess شما وجود دارد این مورد رو بررسی کنید
سلام مال من خطای لاین 132 و 133 میده برای get ها باید چیکار کنم؟
ورودی هایی است که باید به برنامه داده شود تا فایل دانلود شود