使用php下载xlsx文件

时间:2013-04-27 09:23:50

标签: php file header xlsx

我需要从我的网站下载make 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 个答案:

答案 0 :(得分:2)

卸下:

ob_clean();
flush();

在代码末尾添加:

exit();

问题是flush()还会将你的* .xlsx文件内容放入其中的一些垃圾中并且会破坏你的文件,即使你使用ob_clean();

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

答案 1 :(得分:2)

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

标题的问题是需要先在页面上设置它们。如果您在它们之前有一个单独的空间回声,它们将无法工作。所以在设置标题之前需要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);

答案 2 :(得分:2)

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

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

$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);

答案 3 :(得分: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);