繁体   English   中英

使用php下载xlsx文件

[英]Download xlsx file using php

我需要从我的网站下载xlsx文件(但不是像这样直接打开文件网址: http://site.com/file.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

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

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

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

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

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

标题的问题是它们需要首先在页面上设置。 如果您在它们之前甚至有 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);

消除:

ob_clean();
flush();

在代码末尾添加:

exit();

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

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

这对我有用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM