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');
我有这个问题,并且是BOM。
如何注意它
解压缩 :使用解压缩来检查输出文件,我在第二行看到警告。
$ unzip -l file.xlsx
Archive: file.xlsx
warning file: 3 extra bytes at beginning or within zipfile
...
xxd(十六进制查看器) :我用下面的命令看到前5个字节
head -c5 file.xlsx | xxd -g 1
0000000: ef bb bf 50 4b PK...
注意3个第一字节ef bb bf
这是BOM!
为什么?
也许是一个带有BOM的库文件或者库中的前一个输出。
你必须找到文件或命令与BOM的位置,在我的情况和现在,我没有时间去找到它,但我用输出缓冲区解决了这个问题。
<?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");
链接地址: http://www.djcxy.com/p/45447.html