PHP xlsx header

GTCrais picture GTCrais · Apr 17, 2012 · Viewed 60.4k times · Source

so this works:

myphpfile.php:

<?php
header('Content-disposition: attachment; filename=myfile.pdf');
header('Content-type: application/pdf');
readfile('myfile.pdf');
?> 

that php file is called here and the PDF download works fine:

<a class = "oglasavanje" href = "../../cjenik/myphpfile.php">download</a><br/>

but this doesn't work:

<?php
header('Content-disposition: attachment; filename=myfile.xlsx');
header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
readfile('myfile.xlsx');
?>

both .pdf and .xlsx files are in the same folder. When I click on the 'download' link the download windows pops up, I save the file, but the file can't be opened. It gives me the following error:

Excel cannot open the file 'myfile.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.

The file opens fine when I open it manually (i.e. without downloading it via the link)

I'm using WAMP, if that's of importance.

Any help is appreciated.

--- EDIT ---

I've found this piece of code on php.net:

ob_clean();
flush();

so the final code looks like this and it works:

$file = "myfile.xlsx";
header('Content-disposition: attachment; filename='.$file);
header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Length: ' . filesize($file));
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
ob_clean();
flush(); 
readfile($file);

Thanks everyone for the answers.

Answer

Baba picture Baba · Apr 17, 2012

Depends on your browsers so many things can cause such behavior such as Content-length , Cache-Control etc

Also Change

Content-type to Content-Type

Content-disposition to Content-Disposition

Try

$file = "myfile.xlsx" ;
header('Content-Disposition: attachment; filename=' . $file );
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Length: ' . filesize($file));
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile('myfile.xlsx');