2009-12-23 74 views
1

我使用下面的代码来下载一个PDF ....PDF下载不正常

header('Content-Type: application/pdf'); 
    header('Content-Disposition: attachment; filename="NewName.pdf"'); 
    readfile($root_path.'/full-tile-book.pdf'); 

这是一个13 MB的文件,只有下载130K一样,当然不能被打开。我如何调试问题在这里?我的pdf路径是正确的。

+1

在记事本中打开结果,也许你会发现一个php错误到底 – 2009-12-23 20:11:17

回答

1

也许你正在运行到内存/文件大小错误?我在过去使用readfile转储大文件时遇到了问题。除了设置Content-Length头部之外,我建议使用fpassthru(),因为它不会将文件读入缓冲区,它只是将其转储。

set_time_limit(0); // disable timeout 
$file = $root_path.'/full-tile-book.pdf'; 
header('Content-Type: application/pdf'); 
header('Content-Disposition: attachment; filename="NewName.pdf"'); 
header('Content-Length: ' . filesize($file)); 
session_write_close(); // remove this line if sessions are not active 
$f = fopen($file, 'rb'); 
fpassthru($f); 
fclose($f); 
exit; 

编辑:如果您使用的任何sessions_code,这是一个好主意,开始文件转储过程之前结束会话。我已更新我的示例以反映此情况。

0

我想添加一些项目。指定文件名以$文件,然后尝试:

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

这将确保客户期待的正确长度,并很好地之间的输出缓冲区刷新。

0

看到下载的文件也许在PHP中有不好的地址使用。
你可以按照这个教程在PHP中下载文件。

必须在发送任何 输出到浏览器之前发送HTML标头。 PHP 使用标题功能传递原始的 HTML标头。在这个例子中,我们 将从URL www.yourdomain.com/download.php?file=download.zip获取文件名。

<? 
$dir="/path/to/file/"; 
if (isset($_REQUEST["file"])) { 
    $file=$dir.$_REQUEST["file"]; 
    header("Content-type: application/force-download"); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-length: ".filesize($file)); 
    header("Content-disposition: attachment; filename="".basename($file)."""); 
    readfile("$file"); 
} else { 
    echo "No file selected"; 
} 
?> 

我们开始设置目录 哪里要下载的文件位于$ DIR 。请务必不要在 $ dir中使用。然后我们检查以确保在请求中指定了一个 文件名。 如果指定了一个文件,那么我们将 $文件设置为文件的路径和 文件名。现在准备工作是 完成了将文件发送到 浏览器的时间。

第一个标题声明告诉 浏览器期望下载。接下来的 两个头文件分别告诉浏览器 数据的格式和文件大小 。最后一个标题 声明告诉浏览器该文件的名称为 。最后,读取文件 声明将该文件发送到 浏览器。

More information.