2016-11-10 6 views
0

私はPHPコードを開発し、クライアントがどれだけのデータをダウンロードしたかをカウントします。誰かがブラウザから自分のファイルを直接要求すると、私のコードが正常に動作しています。しかし、誰かが '' downthemall ''のようなMozillaエクステンションをインストールし、その拡張子によってURLが要求されると、ファイルURLを4回要求するので、ダウンロードしたデータを4回取得します。これをどうやって解決するのですか?ユーザーがjDownloaderソフトウェアまたは他のソフトウェアを使用しているときも同じことが起こりました。そのため、セグメント化/並列ダウンロードのMozilla Extensionが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について詳しくは、こちらをご覧ください。 enter image description here

+0

申し訳ありませんが、私はthierブラウザでこれを行うには私の顧客に強制することはできませんので、これは私の問題のために働くされていません:クライアント側で

が、これは(DownThemAllを)変更することができます。私はこれをPHPコードで行いたいと思います。だからもう一度見てください。ありがとう –

関連する問題