2016-11-10 106 views
0

我開發了一個PHP代碼並計算客戶端下載了多少數據。如果有人直接從瀏覽器請求我的文件,我的代碼工作正常。但是,如果某人安裝了像「downthemall」這樣的Mozilla擴展程序,然後該擴展程序請求了該URL,則它會請求文件URL 4次,以便我下載數據4次。我該如何解決?用戶使用jDownloader軟件或任何軟件時也會發生同樣的情況。爲什麼Mozilla擴展會導致請求到一個URL多次出現?

這裏是我的完整下載代碼: -

<?php 

function getMimeType($fileName) 
{ 
    $c_type_default = "application/octet-stream"; 
    $content_types = array(
     "exe" => "application/octet-stream", 
     "zip" => "application/zip", 
     "mp3" => "audio/mpeg", 
     "mpg" => "video/mpeg", 
     "avi" => "video/x-msvideo", 
     "mp4" => "video/mp4", 
    ); 
// echo isset($content_types[pathinfo($fileName, PATHINFO_EXTENSION)]) ? $content_types[pathinfo($fileName, PATHINFO_EXTENSION)] : $c_type_default;  
    return isset($content_types[pathinfo($fileName, PATHINFO_EXTENSION)]) ? $content_types[pathinfo($fileName, PATHINFO_EXTENSION)] : $c_type_default; 
} 
function output_file($file, $name) 
{ 

/* 
This function takes a path to a file to output ($file), the filename that the browser will see ($name) and the MIME type of the file ($mime_type, optional). 
*/ 

//Check the file premission 
if(!is_readable($file)) die('File not found or inaccessible!'); 

$size = filesize($file); 

$name = rawurldecode($name); 

//turn off output buffering to decrease cpu usage 
    @ob_end_clean(); 
    include('../includes/configg.php'); 

    // Start Code For Total Downloaded Data Size by The LoggedIn User 
     $user="select * from $TBusers where id=".$_SESSION['log_id']; 
     $result_user = mysqli_query($conn, $user) ; 
     $row = mysqli_fetch_assoc($result_user); 
     $lastsotrage = $row['down']; 
     $curr_date= $row['curr_date']; 
     $today_date= date('d-m-y'); 
     $daily_downloaded_data= $row['daily_downloaded_data']; 
     if($curr_date != $today_date) 
     { 
       $update_curr_date="update $TBusers set curr_date ='$today_date', daily_downloaded_data =0 where id=".$_SESSION['log_id']; // Set Curr_date by Today Date For check Daily Downloaded Data Limit 

       mysqli_query($conn,$update_curr_date) ; 
       $daily_downloaded_data=0; 
     } 
     /*else 
     { 
      if($daily_downloaded_data>=(20*1024*1024*1024)){   // Check Daily Download Data Limit 20GB Exceed or not 
      header('Location: http://idownload.club/members/download.php'); 
      exit;} 
     }*/ 


// required for IE, otherwise Content-Disposition may be ignored 
if(ini_get('zlib.output_compression')) 
ini_set('zlib.output_compression', 'Off'); 

header('Content-Type: ' . getMimeType($name)); 
header('Content-Disposition: attachment; filename="'.$name.'"'); 
header("Content-Transfer-Encoding: binary"); 
header('Accept-Ranges: bytes'); 

/* The three lines below basically make the 
    download non-cacheable */ 
header("Cache-control: private"); 
header('Pragma: private'); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

// multipart-download and download resuming support 
if(isset($_SERVER['HTTP_RANGE'])) 
{ 
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
    list($range) = explode(",",$range,2); 
    list($range, $range_end) = explode("-", $range); 
    $range=intval($range); 
    if(!$range_end) { 
     $range_end=$size-1; 
    } else { 
     $range_end=intval($range_end); 
    } 

    $new_length = $range_end-$range+1; 
    header("HTTP/1.1 206 Partial Content"); 
    header("Content-Length: $new_length"); 
    header("Content-Range: bytes $range-$range_end/$size"); 
} else { 
    $new_length=$size; 
    header("Content-Length: ".$size); 
} 

/* Will output the file itself */ 
$chunksize = 1*(1024*1024); //you may want to change this 
$bytes_send = 0; 
if ($file = fopen($file, 'r')) 
{ 
    if(isset($_SERVER['HTTP_RANGE'])) 
    fseek($file, $range); 

    while(!feof($file) && 
     (!connection_aborted()) && 
     ($bytes_send<$new_length) 
     ) 
    { 
     $buffer = fread($file, $chunksize); 
     print($buffer); //echo($buffer); // can also possible 
     flush(); 
     $bytes_send += strlen($buffer); 
    } 
fclose($file); 

      $lastsotrage= $lastsotrage + $size; 
      $daily_downloaded_data+=$size; 
      $sql="update $TBusers set down =". $lastsotrage." where id=".$_SESSION['log_id']; 
      $sql2="update $TBusers set daily_downloaded_data = $daily_downloaded_data where id=".$_SESSION['log_id']; 
      $sql3= "update test set count=count+1 where id=1" ; 
      mysqli_query($conn,$sql) ; 
      mysqli_query($conn,$sql2) ;mysqli_query($conn,$sql3) ; 
      file_put_contents('data.txt', print_r($_SERVER, true), FILE_APPEND); 


} else 
//If no permissiion 
die('Error - can not open file.'); 
//die 
die(); 
} 
//Set the time out 
set_time_limit(0); 



//path to the file 
$file_dir=$_GET['directory']; 
$file_name = str_replace("/", "", $_GET['file']); 
$file_name = str_replace("\\", "", $file_name); 
$file = $file_dir . "/".$file_name; 


//Call the download function with file path,file name and file type 
output_file($file, ''.$file_name.''); 


?> 

回答

0

由於分段/並行下載的。

提到的擴展正在請求內容範圍(而不是從瀏覽器訪問時的完整內容)。 此功能允許他們同時下載文件內容,通常在更短的時間內下載。

閱讀更多關於partial contentrange requests

在客戶端,這是可以改變(的DownThemAll): enter image description here

+0

抱歉,這不是我的問題工作,因爲我不能強迫我的客戶做這thier瀏覽器。我想通過PHP代碼來做到這一點。所以請再看看。謝謝 –

相關問題