2012-02-13 92 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 2012-02-13 08:15:28

+0

哪一个,Getfile是我在Google找到的?对我来说,他们都似乎工作正常,但我想添加打印fread($ file,round($ download_rate * 1024));函数到http://www.gowondesigns.com/?page.getfile – 2012-02-14 00:16:14

回答

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>(然后将文件ID 1下载)。

<?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

其实我想要的是将download_rate添加到Getfile脚本,在这里http://www.gowondesigns.com/?page.getfile,但无论如何它是非常有帮助的。 – 2012-02-15 12:25:55

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); 
?> 

我用这个。并没有问题。