عضو کانال یوتیوب ما شوید.

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

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

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

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

دقت کنید که اگر سایت شما سایت فروش فایل باشد یا سایت دانلود فایل های مهم باشد حتما این چالش و این موضوع برای شما پر اهمیت است.

دقت کنید در این آموزش با کمک زبان برنامه نویسی PHP به شما نحوه ی ایجاد لینک دانلود غیر مستقیم فایل ها را آموزش می دهیم.

همراه ما باشید.

 

بستن اجرای اسکریپت در دایرکتوری های خاص با htaccess

 

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

 

دانلود کتاب آموزش PHP

 

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

منتظرات نظرات شما هستیم؛ موفق باشید.

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