使用PHP在Chrome中阅读pdf文件时遇到问题。
以下代码是我在PHP中的操作
$path = "actually file path";
header("Pragma: public");
header("Expires: 0");
header("Content-type: $content_type");
header('Cache-Control: private', FALSE);
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Disposition: inline; filename=\"$filename\"");
header('Content-Transfer-Encoding: binary');
header('Content-Length' . filesize($path));
ob_clean();
flush();
readfile($path);
在这里,我将Content-Disposition设置为inline。因为如果用户浏览器具有内置pdf查看器插件,我想显示pdf文件。您可能知道,Chrome内置了pdf查看器。
问题是我在服务器上有一堆pdf文件。 Chrome只能查看其中一些内容。我无法弄清楚为什么其他人不能以同样的方式工作。我检查了每个文件的权限。看起来不是许可问题。
有谁知道问题是什么?谢谢。
答案 0 :(得分:10)
我一直在努力解决同样的问题。这与我在各种浏览器中获得一致结果非常接近。我认为你可能遇到问题的原因是,如果某些PDF文件太大而无法正确处理readfile()。试试这个:
$file = "path_to_file";
$fp = fopen($file, "r") ;
header("Cache-Control: maxage=1");
header("Pragma: public");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=".$myFileName."");
header("Content-Description: PHP Generated Data");
header("Content-Transfer-Encoding: binary");
header('Content-Length:' . filesize($file));
ob_clean();
flush();
while (!feof($fp)) {
$buff = fread($fp, 1024);
print $buff;
}
exit;
答案 1 :(得分:1)
我已经修好了这个方式
$path = 'path to PDF file';
header("Content-Length: " . filesize ( $path ) );
header("Content-type: application/pdf");
header("Content-disposition: inline; filename=".basename($path));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
ob_clean();
flush();
readfile($path);
答案 2 :(得分:1)
出现同样的问题,Chrome没有显示内联PDF,卡在加载时。解决方案是添加header('Accept-Ranges: bytes')
。
我的完整代码:
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="'.$title.'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file));
header('Accept-Ranges: bytes');
header('Expires: 0');
header('Cache-Control: public, must-revalidate, max-age=0');
答案 3 :(得分:0)
我有类似的问题,但我注意到订单很重要。似乎; filename=
必须有引号,Content-Disposition: attachment
试试这个:
$file = "/files/test.pdf";
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
$mime = finfo_file($finfo, $file);
header('Pragma: public');
header('Expires: 0');
header('Content-Type: $mime');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.basename($file).'"'));
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Length' . filesize($file));
ob_clean();
flush();
readfile($file);
答案 4 :(得分:0)
对我来说,添加以下标头可解决此烦人的Chrome错误(?):
header('HTTP/1.1 200 OK');
答案 5 :(得分:0)
在浪费了几个小时之后……我添加了评论以指出@Kal 拥有唯一有效的解决方案。但不知何故,这还不够......当 Chrome 这样做时,这是一个不可能且令人沮丧的问题:
<块引用>错误 无法加载 PDF 文档。重新加载
这是结束折磨的差异。
- // Waste time with chrome:
- header("Content-type:application/pdf");
- header("Content-Disposition:attachment;filename=$file_basename");
- readfile($file);
exit();
---------------------------
+ // Deliver the file:
+ header('Pragma: public');
+ header('Expires: 0');
+ header('Content-Type: $mime');
+ header('Content-Description: File Transfer');
+ header('Content-Disposition: attachment; filename="'.basename($file).'"');
+ header('Content-Transfer-Encoding: binary');
+ header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+ header('Content-Length'.filesize($file));
+ ob_clean();
+ flush();
+ readfile($file);
exit();
在大约三十分钟的时间里,我被它的各种变体愚弄了......但我可以不能将其归结为“添加 HTTP 200 ",不是“添加字节”,不是“引用您的文件名”,不是“分隔文件结尾”。这些都没有用。
(再次感谢@Kal)。