php readfile() 下载脚本在另一个网站空间上不起作用

php readfile() download script doesn't work on another webspace

我在使用 php 下载脚本时遇到了一些问题。这是一个 pdf 文件,点击下载后,它会将整个文件作为纯文本抛出,而不是下载它。 jpeg 和其他文件也会发生这种情况。

这个错误只有在我用 class 包裹代码后才会发生 ->

<?php
class BaseClass {
    function __construct() {
       $this->makeDownload();
    }

    public function makeDownload()
    {
        $downloadfile = "./downloads/file.pdf";
        $filename = "file.pdf";
        $filesize = filesize($downloadfile);

        header("Content-Type: application/pdf"); 
        header("Content-Disposition: attachment; filename='$filename'"); 
        header("Content-Length: $filesize");

        readfile($downloadfile);
    }
}



// In BaseClass constructor
$obj = new BaseClass();
?>

以前的网站空间运行这段代码没有任何问题。 正如我所写,新的网站空间抛出了这样的东西 ->

%PDF-1.5 %âãÏÓ 144 0 obj <> endobj 外部参照 144 41 0000000016 00000 n 00000.....

没有包装 class,一切正常(下载 pdf)。所以导致错误的不是方法。

在其他网站空间的 php.ini 中是否有任何设置,这可能会导致下载包裹在带有文件源代码的 class 垃圾邮件中而不是下载它?

这意味着 HTTP headers 设置不正确,即 Content-TypeContent-Disposition,这会导致浏览器将响应视为纯文本。这可能是由两件事引起的:

  1. 您的 PHP 实际上并没有输出那些 headers。原因是headers不能再输出了,因为你之前已经发送过内容了。启用错误报告以确认这一点,您将看到有关发生这种情况的错误消息。是的,这可能适用于一台服务器,但不适用于另一台服务器。请参阅 https://whosebug.com/a/8028987/476 了解所有可能性的详细概述。

  2. (这里不太可能,但为了完整起见:)PHP 输出 headers 就好了,但它们被 Web 服务器覆盖了。这是一个 Web 服务器配置问题,解决方案在很大程度上取决于所使用的服务器以及您可以配置和不能配置的内容。查阅文档 and/or 联系您的主机。