2012-02-13 8 views
2

私はディレクトリからファイルをダウンロードし、保護するために、この偉大なスクリプトが見つかりました:このPHPスクリプトにダウンロード速度制限を追加するにはどうすればよいですか?

http://www.gowondesigns.com/?page.getfile

を私はあまりにもウェブサイトから、このコードを見て:

// local file that should be send to the client 
$local_file = 'test-file.zip'; 

// filename that the user gets as default 
$download_file = 'your-download-name.zip'; 

// set the download rate limit (=> 20,5 kb/s) 
$download_rate = 20.5; 

if(file_exists($local_file) && is_file($local_file)) { 


// send headers 
header('Cache-control: private'); 
header('Content-Type: application/octet-stream'); 
header('Content-Length: '.filesize($local_file)); 
header('Content-Disposition: filename='.$download_file); 

// flush content 
flush(); 

// open file stream 
$file = fopen($local_file, "r"); 

while (!feof($file)) { 

    // send the current file part to the browser 
    print fread($file, round($download_rate * 1024)); 

    // flush the content to the browser 
    flush(); 

    // sleep one second 
    sleep(1); 
} 

// close file stream 
fclose($file); 


} 
else { 
    die('Error: The file '.$local_file.' does not exist!'); 
} 

私はそれらを組み合わせることができますどのように?私はどのようにgetfileスクリプトを使用してダウンロード速度を追加することができますか?

私が追加してみました:

while (!feof($file)) { 

    // send the current file part to the browser 
    print fread($file, round($download_rate * 1024)); 

    // flush the content to the browser 
    flush(); 

    // sleep one second 
    sleep(1); 
} 

をしかし、その代わりに$ファイルの私はそれがFD $べきであると私は肯定的な結果

私が間違って何をやってもなかったと思いますか?あなたのコメントに基づいて

+0

あなたは与えられたスクリプトを使用するだけで、ファイル以外は何も変更しないでください。上にコピーしたものは、実際のソリューションの下にファイルを開いたり、ヘッダーなどを送ったりしません。 – MrJ

+0

GoogleでGetfileの1つまたは1つを見つけましたか?私にとっては、どちらもうまくいくようですが、print fread($ file、round($ download_rate * 1024))を追加したいと思います。関数をhttp://www.gowondesigns.com/?page.getfile –

答えて

1

- 私はあなたが次のことをしたいと仮定します。

// open file stream 
$file = fopen($local_file, "r"); 

while (!feof($file)) { 

    // send the current file part to the browser 
    print fread($file, round($download_rate * 1024)); 

    // flush the content to the browser 
    flush(); 

    // sleep one second 
    sleep(1); 
} 

// close file stream 
fclose($file); 

あなたはそれが正常にファイルや制限速度をダウンロードするようにユーザに促すようになります全体のスクリプトであること、しかし、注意してくださいそれ。質問の最初のスクリプトの名前をdownload.phpに変更し、<a href='download.php?id=1'>Download 1</a>とリンクしてください(ファイルID1がダウンロードされます)。私はこれを使用

<?php 

$file_id = $_GET['id']; 

if($file_id == 1){ 
    // local file that should be send to the client 
    $local_file = 'test-file.zip'; 
    // filename that the user gets as default 
    $download_file = 'your-download-name.zip'; 
} else { 
    die('Invalid file selected for download'); 
} 

// set the download rate limit (=> 20,5 kb/s) 
$download_rate = 20.5; 

if(file_exists($local_file) && is_file($local_file)) { 
    // send headers 
    header('Cache-control: private'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Length: '.filesize($local_file)); 
    header('Content-Disposition: filename='.$download_file); 

    // flush content 
    flush(); 

    // open file stream 
    $file = fopen($local_file, "r"); 

    while (!feof($file)) { 
     // send the current file part to the browser 
     print fread($file, round($download_rate * 1024)); 

     // flush the content to the browser 
     flush(); 

     // sleep one second 
     sleep(1); 
    } 

    // close file stream 
    fclose($file); 
} else { 
    die('Error: The file '.$local_file.' does not exist!'); 
} 
?> 
+0

実際には私が望んでいたのは、ここでGetfileスクリプトにdownload_rateを追加することですhttp://www.gowondesigns.com/?page.getfile、とにかくそれ非常に役に立ちました。 –

0
<?php 

$file = @$_GET["file"]; 

$rate = 100; // kb/sn 

if (!file_exists($file)) {die("File Not Found");} 

header("Content-Disposition: attachment; filename=" . $file);  
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Description: File Transfer");    
header("Content-Length: " . filesize($file)); 
flush(); // this doesn't really matter. 

$fp = fopen($file, "r"); 
while (!feof($fp)) 
{ 
    echo fread($fp, $rate * 1024); 
    flush(); 
    sleep(1); 
} 
fclose($fp); 
?> 

。そして問題はない。

関連する問題