Я работаю над сайтом, который позволяет учителям загружать документы, а студенты загружают их. Однако есть проблема. Файлы 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));