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

上一篇: PHP force downloading .xlsx file corrupt

下一篇: how to pick few type of file via intent in android?