在我的网站上,我允许管理员阅读用户的简历。这些简历存储在根文件夹之外。为了阅读它们,我提交了一个包含用户ID的表单,从数据库中获取简历的路径,并在新标签中以PDF格式显示给管理员。以下是显示PDF的代码。
$file = "file_name.pdf";
$path = "C:/path/to/file/" . $file;
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $file . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($path));
header('Accept-Ranges: bytes');
readfile($path);
为了提交表单以获取此代码,我在javascript中执行以下操作。
$("#resume-user-id").val(ui.target.attr("id"));
$("#resume-form").submit();
这是表格代码。
<form id="resume-form" method="post" action="/account/profile/preview_resume.php" target="_blank">
<input id="resume-user-id" type="hidden" name="user_id"></input>
</form>
现在,这一切都很好,花花公子,PDF正确显示,因为我已经在文件名和路径中进行了硬编码。但是,只要我访问一个post变量,PDF就不会加载。即使我将文件名保持硬编码,只是检查是否使用isset函数设置了post变量,所有内容都会中断。该页面看起来像是在尝试加载PDF,但它只是继续加载,加载和加载......
任何可能导致此问题的想法?
- UPDATE -
我删除了header('Accept-Ranges: bytes');
行,现在它工作正常(大部分)。这个标题到底是做什么的,为什么会在这种情况下引起问题?我说'大多数'都很好,因为除了我测试PDF之外的所有工作。然而,其中一个,我只是收到一条消息,上面写着“无法加载PDF”...不确定为什么会这样,或者它与其他人有什么不同。
答案 0 :(得分:1)
好的,我终于明白了。更新原始问题后,我仍然遇到大于1MB的PDF文件的错误。 Chrome不会显示文件,IE(兼容模式)会破坏它们。在找到解决方案之前,我没有在firefox中测试它。我的最终脚本如下所示:
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $file . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($path));
header('Accept-Ranges: none');
ob_clean();
flush();
readfile($path);
请注意,$ file是文件的名称(即filename.pdf),$ path是文件的路径(即C:/path/to/file/filename.pdf)。对于原始问题,我在readfile调用之前添加了ob_clean();
和flush();
,并将'Accept-Ranges'标头设置为'none'。
现在可以在chrome和IE(兼容模式)中查看PDF文件。在firefox中,文件实际上是下载的,但我并不太担心。
此处发现类似的问题和答案:PHP stream PDF with fread and readfile produce a damaged pdf