2

I found this great script to download and protect the files from a directory:

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

And I saw this code from a website too:

// 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!');
}

How can I combine them? I mean how can I use the getfile script and add a download rate to it?

I tried adding:

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

But instead of $file I think it should be $fd and I had no positive results

What am I doing wrong?

  • Why not just use the script you were given and don't change anything except for the file? What you copied above, below the actual solution doesn't even open the file, nor send headers, etc etc – MrJ Feb 13 '12 at 08:15
  • Which one, the Getfile one or the one I found in Google? For me both of them seems to work fine but I'd like to add the print fread($file, round($download_rate * 1024)); function to the http://www.gowondesigns.com/?page.getfile – Gianfranco Mileo Feb 14 '12 at 00:16

2 Answers2

1

Based on your comment - I assume you want the following:

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

You should note, however, that it is the whole script that will make it successfully prompt a user to download the file and speed limit it. Simply rename the first script in your question as download.php, then link to it as <a href='download.php?id=1'>Download 1</a> (then file ID 1 will download).

<?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!');
}
?>
MrJ
  • 1,910
  • 1
  • 16
  • 29
  • Actually what I wanted is to add the download_rate to the Getfile Script here http://www.gowondesigns.com/?page.getfile, but anyways it was very helpful. – Gianfranco Mileo Feb 15 '12 at 12:25
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); 
?>

i use this . And no problem.

Ahmet Uğur
  • 462
  • 6
  • 12