我在php下载脚本方面遇到了一些问题。这是一个pdf文件,点击下载后,它会将整个文件作为纯文本而不是下载。jpeg和其他文件也会发生这种情况。
这个错误只会发生在我把一个类包装在代码上之后->
<?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();
?>
以前的Web空间运行此代码没有任何问题。正如我所写的,新的网络空间抛出了这样的东西->
%PDF-1.5%endobj xref 144 41 00000000 16 00000 n 00000…
如果没有包装好的类,一切都会正常工作(下载pdf)。所以导致错误的不是方法。
在其他Web空间的php.ini中是否有任何设置,这可能会导致下载被包裹在类中,并带有文件源代码,而不是下载它?
这意味着没有正确设置HTTP标头,即Content-Type
和Content-Disposition
,这导致浏览器将响应视为纯文本。这可能是由两件事引起的:
-
您的PHP实际上并没有输出这些头。这样做的原因是无法再输出标头,因为您以前已经发送过内容。启用错误报告以确认这一点,您将看到有关此情况的错误消息。是的,这可能适用于一台服务器,但不能适用于另一台服务器。看见https://stackoverflow.com/a/8028987/476对于所有可能性的一个伟大的概述。
-
(这里不太可能,但为了完整起见:)PHP输出的头很好,但它们被web服务器覆盖了。这是一个web服务器配置问题,解决方案将在很大程度上取决于正在使用的服务器以及您可以配置和不能配置的内容。请参阅文档和/或与您的主机联系。