PHP在我的服务器上创建巨大的错误文件feof()fread()

时间:2010-05-11 03:20:18

标签: php fopen fread error-log

我有一个脚本,允许用户'另存为'pdf,这是脚本 -

<?php
header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);
?>

正在创建一个错误日志,并且我收到的错误会在几天之内变成一场演出 -

[10-May-2010 12:38:50] PHP Warning:  filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for BYJ-Timetable.pdf in /home/byj/public_html/pdf_server.php on line 10
[10-May-2010 12:38:50] PHP Warning:  Cannot modify header information - headers already sent by (output started at /home/byj/public_html/pdf_server.php:10) in /home/byj/public_html/pdf_server.php on line 10
[10-May-2010 12:38:50] PHP Warning:  fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12
[10-May-2010 12:38:50] PHP Warning:  feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13
[10-May-2010 12:38:50] PHP Warning:  fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15
[10-May-2010 12:38:50] PHP Warning:  feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13
[10-May-2010 12:38:50] PHP Warning:  fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15

第13行和第15行只是继续......我是一个有点新手的PHP所以任何帮助都很棒。 多谢你们 NIK

4 个答案:

答案 0 :(得分:4)

发生的事情是:

  • 找不到您的文件,因此filesize功能错误
  • 因为它出错了,所以产生了输出。
  • 输出后,您无法再发送标题
  • 因为您要发送更多标题,所以会出现更多错误

因为找不到你的文件,你的while循环将永远错误,因为你试图从一个不存在的文件中读取。

ALSO:一个文件有一个内容类型,而不是4.你需要选择一个内容类型并使用它,你不能全部传递它们。

最后:你的剧本非常不安全。如果有人通过?file=/home/apache/secret_db_passwords.txt,那么他们会立即访问您的内容。

编辑:PHP有一个名为readfile的函数,旨在准确处理您要执行的操作。您不需要通过逐位发送文件来运行while循环。只做readfile($file);,网络服务器将为您处理所有废话

答案 1 :(得分:1)

一些事情:

  1. 据我所知,您只能设置一次标题,因此将Content-Type设置为四次是毫无意义的。

  2. 如果您将内容类型设置为pdf mime类型可能会有所帮助,在这种情况下,我会使用application/pdf

  3. 据我所知,
  4. Force Download不是内容类型。如果您将Content-Disposition设置为attachment,则会下载浏览器。

  5. 最后,如果没有该文件的PDF版本(看起来没有),为什么要尝试从中流式传输?您可能希望将$file变量设置为实际文件,并创建另一个变量$filename以设置输出给用户的PDF文件名。

答案 2 :(得分:1)

[10-May-2010 12:38:50] PHP Warning:  fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12

这应该告诉您需要知道的内容:fopenfilesize都需要传递要打开的文件的名称和路径。在这种情况下,您只是传递文件名,没有路径,所以它试图在运行脚本的当前目录中找到它。在这种情况下,/home.byj/public_html/

要解决此问题,您需要将相对或绝对路径应用于PDF文件以打开这些功能,而不仅仅是PDF文件本身的名称。

答案 3 :(得分:1)

您可以使用:http://php.net/manual/en/function.readfile.php吗?

而不是循环和读取文件的各个部分