5

我需要xlsx从我的网站下载文件(但不是像这样直接打开文件网址http://site.com/file.xlsx:)

所以,这是php代码

        $file = "somefile.xlsx";
        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);

文件已下载,他的扩展名是.xlsx,但是当尝试在 ms excel 中打开此文件时,文件未打开并且出现错误:excel cannot open the file.xlsx because the file format or file extension is not valid

请告诉我,为什么会这样?我错在哪里?

4

4 回答 4

6

多年后,我遇到了同样的问题,经过搜索,我再次来到这里))

这是解决方案,对我有用:

$file = "somefile.xlsx";
// define file $mime type here
ob_end_clean(); // this is solution
header('Content-Description: File Transfer');
header('Content-Type: ' . $mime);
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" . basename($file) . "\"");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile($file);
于 2020-01-28T08:49:56.493 回答
3

您必须在其他文件的中间使用此代码。

标题的问题是它们需要首先在页面上设置。如果您甚至有 1 个单个空格在它们之前回显,它们将不起作用。所以你需要在设置标题之前 ob_clean() [清理缓冲区]

尝试

    ob_clean();
    flush();
    $file = "somefile.xlsx";
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
于 2016-07-19T12:20:41.433 回答
2

消除:

ob_clean();
flush();

在代码末尾添加:

exit();

问题是 flush() 也会在你的 *.xlsx 文件内容中抛出一些垃圾,即使你使用 ob_clean(); 也会损坏你的文件。

为了更好地理解,请访问 php.net 并阅读 flush()、ob_flush() 之间的区别,并发现在第一种情况下您甚至不需要它们。因此,您也不需要 ob_clean() 。

于 2015-04-05T11:18:43.773 回答
0

这对我有用:

    header('Content-Description: File Transfer');
    header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    header("Content-Disposition: attachment; filename=\"".basename($fileLocation)."\"");
    header("Content-Transfer-Encoding: binary");
    header("Expires: 0");
    header("Pragma: public");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Length: ' . filesize($fileLocation)); //Remove

    ob_clean();
    flush();

    readfile($fileLocation);
于 2015-08-15T02:10:05.377 回答