من رفتم سربازی اگر محتوای منو دوست داشتید و بدردتون خورد از من حمایت مالی کنید

ایجاد لینک دانلود غیرمستقیم فایل با php

ایجاد لینک دانلود غیرمستقیم فایل ها با php
undirect-download-link-in-php

ایجاد لینک دانلود غیرمستقیم فایل با 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 شدن خواهند شد.

 

اگر مشکلی در استفاده از کدهای بالا دارید در بخش نظرات برای ما بنویسید؛ این کد و ترفند کاملا اختصاصی انجام شده است و در صورتی که این کدها را در سایت خود منتشر کردید لطفا لینک منبع را نیز ذکر کنید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 4 میانگین: 5]