Chrome 下载按钮正在下载 PHP 文件而不是 PDF

Chrome Download Button downloading PHP file instead of PDF

网上有很多类似的问题,none 其中的问题似乎是完全相同的情况,也没有提供任何关于正在发生的事情或如何解决问题的见解。我希望我可以在我的测试中提供更多信息,并缩小我认为正在发生并导致此问题的范围。

我正在屏幕上回显和预览通过 SSRS 创建的 PDF 文件,大多数时候我看到的是我明确设置的正确 headers,但我只有一份报告似乎改变 Content-Control header 的类型。发生这种情况时,Chrome 中的下载按钮将提示下载我的 controller.php 文件而不是 PDF。

我在 IIS 服务器上使用 PHP 运行。这是我在代码中明确设置的 headers:

   header('content-type:application/pdf');
   header('Cache-Control: store; cache; no-revalidate');
   header('Content-Disposition: inline; filename=' . $this->sFileName . '.pdf');

对于我输出的大部分报告,header 匹配这些值。以下是正确输出的报价报告示例:

这是在 Chrome PDF 预览器中单击下载按钮时的结果:

在我对多个报告的测试中,有一个特别是订单报告,它似乎总是改变 Content-Disposition header:

这是在 Chrome PDF 预览器中单击下载按钮时的结果:

我 运行 一个测试,我注释掉了我在上面设置的 Cache-Control header 行和 re-ran 报价报告。我得到的 Cache-Control header 的结果与我为订单报告得到的结果相同,并且在下载我的 controller.php 文件而不是 PDF 时得到相同的结果。这就是为什么我认为它与导致此问题的 header 有关。我没有在其他任何地方明确地在我的代码中设置 header 必须更改它。我希望有人知道一些关于 header 的信息,特别是在 PHP 中,这可能会导致值发生变化。

提前致谢!

我能够在我的场景中解决这个问题。

我最终意识到,每次我打印订单报告时,我的 headers 都没有被发送。在最后一行检查 headers_sent() 的状态返回 false.

现在,为什么它不只为这种报告类型发送 headers,我不知道......从仔细地一遍又一遍地检查代码行,一切似乎都是相同的当我打印报价报告时。然而报价报告始终按预期发送 headers 并将 $file$line 参数传递给 headers_sent() 输出正确的文件和行 # 我正在回应即将到来的 PDF从 SSRS 回来。我注意到这一点是因为订单报告命中了我的 session_start() 代码,而如果输出 headers 则不应命中。这很奇怪,因为订单报告仍在输出到屏幕上,所以我真的不知道为什么它认为 headers 没有被发送。

我最后所做的只是在回显报告后立即添加一个 ob_flush() 以确保内容和 headers 被发送。这似乎一直有效。

如果有人知道为什么 headers 没有被发送。我很想听听评论。