Page 1 of 1

Redirecting user to new page after header()

Posted: Thu Feb 28, 2008 4:38 pm
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);
?>
 

Re: Redirecting user to new page after header()

Posted: Thu Feb 28, 2008 10:16 pm
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?

Re: Redirecting user to new page after header()

Posted: Fri Feb 29, 2008 1:08 am
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.