我有一个脚本,允许用户'另存为'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
答案 0 :(得分:4)
发生的事情是:
filesize
功能错误因为找不到你的文件,你的while循环将永远错误,因为你试图从一个不存在的文件中读取。
ALSO:一个文件有一个内容类型,而不是4.你需要选择一个内容类型并使用它,你不能全部传递它们。
最后:你的剧本非常不安全。如果有人通过?file=/home/apache/secret_db_passwords.txt
,那么他们会立即访问您的内容。
编辑:PHP有一个名为readfile
的函数,旨在准确处理您要执行的操作。您不需要通过逐位发送文件来运行while循环。只做readfile($file);
,网络服务器将为您处理所有废话
答案 1 :(得分:1)
一些事情:
据我所知,您只能设置一次标题,因此将Content-Type
设置为四次是毫无意义的。
如果您将内容类型设置为pdf mime类型可能会有所帮助,在这种情况下,我会使用application/pdf
。
Force Download
不是内容类型。如果您将Content-Disposition
设置为attachment
,则会下载浏览器。
最后,如果没有该文件的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
这应该告诉您需要知道的内容:fopen
和filesize
都需要传递要打开的文件的名称和路径。在这种情况下,您只是传递文件名,没有路径,所以它试图在运行脚本的当前目录中找到它。在这种情况下,/home.byj/public_html/
要解决此问题,您需要将相对或绝对路径应用于PDF文件以打开这些功能,而不仅仅是PDF文件本身的名称。
答案 3 :(得分:1)