我有一个网站,现在已经有几年的历史了,它基本上提供下载。
无论如何,由于移动服务器,人们无法下载文件,因为它现在给出了一个错误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和其他网站中的大量内容后,这看起来很好。
有人能说出我为什么会犯这些错误吗?
感谢
问题出在中
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));
它会按照你的意愿工作。
根据您所说的,问题是因为在编写要下载的代码之前,您对echo
说过一些话。为了克服这个问题,您应该编写代码,以便在执行下载时在下载代码之后编写echo
。
它可能并不总是一个echo
,它可能是一些HTML tags
而不是它
如果你想从任何页面下载一些东西到客户端的系统,下载应该是在任何页面上运行的第一件事。
此问题与发送标头之前出现的某些输出有关。
常见的问题是,一些字符(如空格、新行,甚至UTF-8格式的BOM(字节顺序标记))在启动php标记之前被放置。
在发送标头之前,您需要确保绝对没有回音,并且需要检查脚本中包含的所有文件。
此外,ob_clean();和flush();代码中不需要函数。
据我所知,不需要flush()
。也不用
ob_clean();
flush();
只需使用ob_end_clean()
来清除任何缓冲的代码。
你说你正在移动服务器,现在它不工作了,这是否意味着你也修改了PHP设置或版本?
如果是,则发布output_buffering
的PHP配置。