PHP принудительно загружает файл .xlsx

Я работаю над сайтом, который позволяет учителям загружать документы, а студенты загружают их. Однако есть проблема. Файлы Microsoft Word (.docx) загружаются отлично, но при загрузке файла excel (xlsx) excel дает диалог «Этот файл поврежден и не может быть открыт». Любая помощь с этим будет принята с благодарностью!

Мой код загрузки выглядит следующим образом:

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; 

это отлично работает на моей локальной настройке xampp, независимо от расширения, поэтому с моей точки зрения никакой аргумент case не нужен, если мне не хватает чего-то

я тестировал с docx, accdb, xlsx, mp3, что угодно …

 $filename = "equiv1.xlsx"; header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Pragma: no-cache'); 

У меня есть эта проблема и была спецификацией .

Как это заметить

unzip : Проверяя выходной файл с помощью распаковки, я увидел предупреждение во второй строке.

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

xxd (hex viewer) : я увидел первые 5 байтов со следующей командой

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

Обратите внимание на 3 первых байта ef bb bf , это спецификация!

Зачем?

Возможно, файл php с спецификацией или предыдущий вывод из библиотеки.

Вы должны найти, где находится файл или команда с спецификацией. В моем случае и прямо сейчас у меня нет времени его найти, но я решаю это с помощью выходного буфера.

 <?php ob_start(); // ... code, includes, etc ob_get_clean(); // headers ... readfile($file); 

попробуй это:

 header("Content-Disposition: attachment; filename=\"$filename\""); header("Content-Type: application/vnd.ms-excel"); 

пытаться:

 <? //disable gzip @apache_setenv('no-gzip', 1); //set download attachment header('Content-Disposition: attachment;filename="filename.xlsx"'); //clean the output buffer ob_clean(); //output file readfile('filepath/filename.xlsx'); //discard any extra characters after this line exit; ?> 

Попробуйте добавить дополнительный заголовок

 header('Content-Length: ' . filesize('./uploads/resources/courses/' . $filename));