我需要从我的网站下载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
请告诉我,为什么会这样?哪里错了?
答案 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);