PHP force downloading .xlsx file corrupt

download, header, php, readfile

Solution

I have this problem and was the BOM.

How to notice it

unzip: Checking the output file with unzip, I saw a warning at the second line.

$ unzip -l file.xlsx 
Archive:   file.xlsx
warning file:  3 extra bytes at beginning or within zipfile
...

xxd (hex viewer): I saw the first 5 bytes with the following command

head -c5 file.xlsx | xxd -g 1
0000000: ef bb bf 50 4b                             PK...

Notice the 3 first bytes `ef bb bf` that's BOM!

Why?

Maybe a BOM before the very first `<?php` tag on some php file or a previous output from a library.

You have to find where is the file or command with the BOM, In my case and right now, I don't have time to find it, but I solve this with output buffer.

<?php
ob_start();

// ... code, includes, etc

ob_get_clean();
// headers ...
readfile($file);

Problem

I am working on a site that allows teachers to upload documents and students download them. However, there is a problem. Microsoft Word (.docx) files download perfectly, but when downloading an excel (xlsx) file, excel gives a "This file is corrupt and cannot be opened" dialog. Any help with this would be greatly appreciated! My download code is as follows: ``` case 'xlsx': header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Pragma: no-cache'); readfile('./uploads/resources/courses/' . $filename); break; ```

Original source

Related problems