我有一个现在已有几年历史的网站,它基本上提供了下载。
无论如何,因为移动服务器的人无法下载文件,因为它现在给出了错误500错误,并且在日志文件中它带来了这个错误:
来自脚本的格式错误的标头。错误的标头= 1:index.php
与此无关的唯一与此相关的代码是:
// Echo $productOptionDetails->file;
$file = DOWNLOAD_FOLDER. '/'. $productOptionDetailEntity->file;
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file) + 1);
ob_clean();
flush();
readfile($file);
exit;
}
现在如果我输出:
// Echo $productOptionDetails->file;
$file = DOWNLOAD_FOLDER. '/'. $productOptionDetailEntity->file;
if (file_exists($file)) {
readfile($file);
exit;
}
它会输出大量加密文本,因此它显然可以阅读。
我所看到的是标题不正确但在阅读了php.net以及其他网站中的内容后,这看起来很不错。
任何人都可以大声说出我为什么会收到这些错误吗?
由于
答案 0 :(得分:7)
问题在于
header('Content-Length: ' . filesize($file) + 1);
在加号之前评估点,因此你的代码是字符串+ 1,结果是1,这导致1作为标题发送。 正确的代码应该是
header('Content-Length: ' . filesize($file));
因为根据此页http://www.php.net/manual/en/function.readfile.php,不使用+1。其他解决方案是
header('Content-Length: ' . (filesize($file) + 1));
可以按你的意愿工作。
答案 1 :(得分:0)
根据您所说的,问题是因为在您编写要下载的代码之前,您曾向echo
说过某些内容。要解决这个问题,您应该编写代码,以便在下载代码执行时应在下载代码之后编写echo
。
它可能并不总是echo
,而是HTML tags
而不是{{1}}。
如果您想从该页面下载某些内容到客户端,那么下载应该是在任何页面中运行的第一件事。系统
答案 2 :(得分:0)
此问题与您发送标头之前出现的某些输出有关。
在启动php标记之前,会出现一些常见的问题,例如空格,新行甚至是UTF-8格式错误的BOM(字节顺序标记)。
您需要确保在发送标头之前绝对没有回音,并且需要检查脚本中所有包含的文件。
另外,ob_clean();和flush();您的代码中不需要函数。
答案 3 :(得分:0)
据我所知,代码flush()
不需要。而不是使用
ob_clean();
flush();
只需使用ob_end_clean()
清除所有缓冲的代码。
并且你说你正在移动服务器,现在它无法正常工作,这是否意味着你已经修改了PHP设置或版本?
如果是,则发布output_buffering
的PHP配置。