5

我有一个几年前的网站,它基本上提供下载。

无论如何,由于移动服务器人们无法下载文件,因为它现在给出错误 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 以及其他网站中的大量内容之后,这看起来很好。

谁能大喊我为什么会收到这些错误?

谢谢

4

4 回答 4

7

问题出在

header('Content-Length: ' . filesize($file) + 1);

点在 plus 之前被评估,所以你的代码是字符串 + 1,结果是 1,这导致 1 作为标题发送。正确的代码应该是

header('Content-Length: ' . filesize($file));

因为根据此页面http://www.php.net/manual/en/function.readfile.php没有使用 +1。其他解决方案是

header('Content-Length: ' . (filesize($file) + 1));

这将按您的意愿工作。

于 2014-04-22T06:31:13.563 回答
0

根据您所说的,问题是因为echo您在编写要下载的代码之前说过一些话。为了克服这个问题,您应该编写代码,以便echo在执行下载时在下载代码之后编写。

它可能并不总是一个echo,它可能是一些HTML tags而不是它。

如果您想从该页面下载某些内容到客户系统,那么下载应该是在任何页面中运行的第一件事。

于 2014-04-15T10:42:20.563 回答
0

据我所知,flush()不需要代码。也代替使用

ob_clean();
flush();

只是ob_end_clean()用来清除任何缓冲的代码。

你说你正在移动服务器,现在它不起作用,这是否意味着你也修改了 PHP 设置或版本?

如果是,则发布 .php 的 PHP 配置output_buffering

于 2014-04-21T11:27:22.637 回答
0

此问题与发送标头之前出现的某些输出有关。

在开始 php 标记之前放置一些字符,如空格、换行符甚至 UTF-8 格式错误的 BOM(字节顺序标记)是一个常见问题。

您需要确保在发送标头之前绝对没有回显,并且需要检查脚本中所有包含的文件。

另外,ob_clean(); 和冲洗();您的代码中不需要函数。

于 2014-04-16T12:17:53.143 回答