Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Chrome中生成PDF会导致错误\u无效\u响应_Php_Google Chrome_Pdf - Fatal编程技术网

Php 在Chrome中生成PDF会导致错误\u无效\u响应

Php 在Chrome中生成PDF会导致错误\u无效\u响应,php,google-chrome,pdf,Php,Google Chrome,Pdf,在浏览器中以编程方式(通过PHP)生成PDF时,渲染的PDF在Firefox和Safari中都显示良好,但Chrome返回ERR_INVALID_响应。这是一个有效的PDF文件-从工作浏览器保存后,可以使用Adobe Reader/Preview在本地打开,从其他浏览器保存PDF文件后,甚至可以在Chrome中打开 正在通过file\u get\u contents()读取PDF文件,并为其提供当前时间戳,然后将其传递到浏览器。解决方法包括将文件保存到临时位置并重定向用户(至少对于Chrome)

在浏览器中以编程方式(通过PHP)生成PDF时,渲染的PDF在Firefox和Safari中都显示良好,但Chrome返回ERR_INVALID_响应。这是一个有效的PDF文件-从工作浏览器保存后,可以使用Adobe Reader/Preview在本地打开,从其他浏览器保存PDF文件后,甚至可以在Chrome中打开

正在通过
file\u get\u contents()
读取PDF文件,并为其提供当前时间戳,然后将其传递到浏览器。解决方法包括将文件保存到临时位置并重定向用户(至少对于Chrome),但这并不理想

我已经研究过了,只找到了

我知道这是报头错误。生成PDF后,将以下标题发送到浏览器(在FF、Safari和IE中也可以正常工作):

我还尝试在搜索堆栈溢出后添加以下标题,但没有效果:

    header("Content-Transfer-Encoding: binary");
    header('Accept-Ranges: bytes');
是否缺少Chrome所需的标题?有没有人有在Chrome中显示动态生成的PDF的经验

编辑:我的一个更突出的问题是,是什么原因导致它在Chrome中本地运行良好,但在服务器环境中不起作用。

试试这个

<?php
$filename = 'Physical Path to PDf file.pdf';
$content = file_get_contents($filename);

header("Content-type:application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition:inline;filename='".basename($filename)."'");   
header('Content-Length: '.strlen( $content ));

// The PDF source is in original.pdf
readfile($filename);
?>

<html>
<body>
...
...
...

...
...
...
确保在输出PHP脚本之前调用了上面的头代码 已发送到浏览器


我要感谢大家的回答

事实证明,这与标题无关。在尝试以各种方式(检测编码、尝试使用和不使用内容长度等)更改/删除标题后,我们决定深入研究httpd日志,看看Chrome是否有不同的解决方案

事实证明,我们服务器上的
mod_sec
将请求(出于某种原因仅来自Chrome)标记为试图进行文件注入攻击,并返回403禁止响应。Chrome将其显示为
ERR\u INVALID\u响应,而不是403


CDN的主机名出现在请求中(我们在端点进行了充分的检查,以确保该文件确实是一个允许的资源),并在服务器上构建URL

在我的例子中,我必须将这两个参数添加到标题中,因为wordpress发送404代码,因为它无法识别我的php函数的url:

header("Content-type: application/pdf",true,200);
如本文所述

这将强制标头替换wordpress生成的404状态代码(第二个参数
true
),因为它无法识别自定义url,并设置200 OK(第三个参数
200

结果是这样的:

$pdf_name = "test.pdf";
$pdf_file = "/absolute/path/to/my/pdfs/on/my/server/{$pdf_name}";
header('Content-type: application/pdf',true,200);
header("Content-Disposition: attachment; filename={$pdf_name}");
header('Cache-Control: public');
readfile($pdf_file);
exit();

您是否尝试过将配置更改为附件?标题('Content-Disposition:attachment;;filename=“YourFileName”')@HNA I有-无论是否使用附件,相同的错误都会导致Chrome。有两个按钮:“save”抛出
标题('Content-Disposition:attachment;')
以便自动下载文件(这在Chrome、FF和Safari中本地工作,在Safari和Firefox中非本地工作)。另一个按钮“查看”,只显示PDF文件而不自动下载。目前这两个版本都不能在非本地实例中使用Chrome。是否发送
头('Content-Length:')。filesize($yourfile))?@maxhb是。以下标题随请求一起发送:
header('Content-Type:application/pdf')
标题('Content-Disposition:inline;filename=“.$filename.”)
标题('Expires:0')
标题('Cache-Control:必须重新验证,后检查=0,预检查=0')
标题('Pragma:public')
标题('Content-Length:'.$Length)Chrome首先需要状态200标题。这是有效的:标题($_服务器[“服务器_协议”]。“200OK”);标题('Content type:application/pdf');标题('Content-Disposition:inline;filename=“.$filename.”);标题('内容传输编码:二进制');标题('接受范围:字节');谢谢你的建议。我试了又试,但都没有运气。我在对原始问题的评论中发布了附加标题的完整列表。还要注意的是,我们实际上并没有将文件“读取”到浏览器中,而是读取PDF,对其进行修改,然后将新创建的文件作为即时下载附件或在浏览器的PDF查看器中提供(在此过程中,文件在任何时候都不会保存到磁盘)。您是如何解决的?我也遇到了同样的问题。我需要知道这个问题的解决方案,我也遇到了同样的问题。它能够显示图像,但不会显示PDF引用错误无效响应,实际上是403错误。@netrox解决方案包含在答案中。我们的被抛出是因为我们的CDN的url(AmazonS3)出现在查询中。我们将其从URL中删除,然后在端点处重新添加。您在服务器上构建URL是什么意思@AndrewKlatzke@Pascal我们在查询中发送了整个CDN url。我们不是直接在请求上发送它(&key={endpointUrl}/resource),而是只发送资源句柄,在请求到达后找出端点(cdnurl),将两者连接起来并使用该版本。
$pdf_name = "test.pdf";
$pdf_file = "/absolute/path/to/my/pdfs/on/my/server/{$pdf_name}";
header('Content-type: application/pdf',true,200);
header("Content-Disposition: attachment; filename={$pdf_name}");
header('Cache-Control: public');
readfile($pdf_file);
exit();