[英]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.