views:

47

answers:

3

When I download the original zip it works fine, but when I download it using the below headers and stuff it doesn't work. I know it's better to take this route and tell the browser how to handle the file rather than leave it up to the browser, but I can't get this to work, so I'm tempted to use a header() forward.

            $path = $this->tru->config->get('root.path').'/Digital Version of Book for Web.zip';

            set_time_limit(0);
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header('Content-Type: application/zip');
            header("Content-Transfer-Encoding: binary");
            header('Content-Disposition: attachment; filename="NewFileName.zip"');
            header('Content-Length: ' . filesize($path));

            $f = fopen($path, 'rb');
            fpassthru($f);
            fclose($f);

Edit:

Sorry, what I mean by it doesn't work is that the file downloads in a zip format (all 9.3 MB) but I'm unable to unpackage the zip because it's invalid.

A: 

The problem could be caused by the file name which contains spaces. Avoid spaces in paths. For the rest, an error message would be most helpful!

tharkun
A: 

Try using readfile(). An example is provided in the PHP Manual.

$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
Thomas
+1  A: 

Take a look into the ZIP file using Notepad or another text editor. Check whether there is a PHP error message screwing up the file on the first few lines. It could be a "headers already sent" message or the set_time_limit() call throwing an error due to the script being in safe mode.

Pekka