Redirecting user to new page after header()

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
mc3
Forum Newbie
Posts: 13
Joined: Thu Jan 24, 2008 5:31 pm

Redirecting user to new page after header()

Post by mc3 »

Hello.

I'm using several header() commands to force the download of a file after a user's credentials are approved. I want to redirect them to another automatically, immediately after downloading begins.

My understanding is that I can't use header("Location: ...) because I've already sent header() to force the download.

And my browser isn't seeing javascript like the following if it comes after header():
<script>
<!--
window.location="http://www.yourdomain.com/";
// -->
</script>

Are there any other options? I'd even be satisfied with something like:
echo "Thanks for downloading. Click <a href="index.html">here</a> to back home."
but my browser also doesn't display this if it follows header().

Full code below. Any ideas?

Code: Select all

 
<?
//removed beginning
 
else{
    //force download
    function output_file($file, $name, $mime_type='')
    {
 
     //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).
 
 
     if(!is_readable($file)) die('File not found or inaccessible!');
 
     $size = filesize($file);
     $name = rawurldecode($name);
 
     @ob_end_clean(); //turn off output buffering to decrease cpu usage
 
     // required for IE, otherwise Content-Disposition may be ignored
     if(ini_get('zlib.output_compression'))
      ini_set('zlib.output_compression', 'Off');
 
     header('Content-Type: ' . $mime_type);
     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);
     }
 
 
 
     // output the file itself
     $chunksize = 1*(1024*1024);
     $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); // is also possible
            flush();
            $bytes_send += strlen($buffer);
        }
     fclose($file);
     } else die('Error - can not open file.');
 
    die();
    }
 
    set_time_limit(0);
    $file_path='mp3/mp3.zip';
    output_file($file_path, 'Seens', 'application/zip');
 
 
 
}
 
 
 
 
mysql_close($con);
?>
 
User avatar
hawkenterprises
Forum Commoner
Posts: 54
Joined: Thu Feb 28, 2008 9:56 pm
Location: gresham,oregon
Contact:

Re: Redirecting user to new page after header()

Post by hawkenterprises »

have you thought about doing it the other way around. Have your header force download code in a iframe and have your thanks for downloading on the page.

some results page
<iframe src="headerforce.php">
</iframe><a href="somepage.html">Thanks for downloading</a>

headerforce.php
header (commands);


Make sense?
User avatar
Kieran Huggins
DevNet Master
Posts: 3635
Joined: Wed Dec 06, 2006 4:14 pm
Location: Toronto, Canada
Contact:

Re: Redirecting user to new page after header()

Post by Kieran Huggins »

yeah, you can't redirect after any data has been sent... including file data.

Instead of using an iframe I'd use a <meta> redirect, with the standard "click here if the download doesn't begin automagically" link in the thank you text. I think you'll probably find that this is the most common solution, if that means anything.

But for the love of dairy foods, please don't use a 5 or 10 second redirect timeout for the redirect. There's just no need, and it makes users wonder if the download is ever going to start. They can read the thank you after hitting "save". I'd say 1 second max, and would personally go with a 0 second timeout.
Post Reply