ایجاد لینک دانلود غیرمستقیم فایل ها با 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>
برای مشاهده ترفندهای بیشتر htaccess روی این لینک کلیک کنید.
اگر تمامی موارد بالا را به درستی انجام داده باشید باید این سیستم کوچک کار بکند و شما نیاز نیست لینک مستقیم فایل ها را در سایت خود استفاده کنید و نگران این نباشید که کاربران شما لینک خود را به دیگران بدهند.
دقت کنید اگر کد فایل 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 شما وجود دارد این مورد رو بررسی کنید
سلام مال من خطای لاین ۱۳۲ و ۱۳۳ میده برای get ها باید چیکار کنم؟
ورودی هایی است که باید به برنامه داده شود تا فایل دانلود شود