以下代码最奇特的问题。它向浏览器返回一个 pdf 报告。
function cart_aspdf() {
trace('cart_aspdf_in');
$file = 'order_WS000250.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $file . '"');
$file = APPPATH.'pdfcache/'.$file;
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');
trace('cart_aspdf_readfile');
@readfile($file);
trace('cart_aspdf_out');
}
opera、firefox、ie、safari 中的跟踪输出如您所料:
- cart_aspdf_in
- cart_aspdf_readfile
- cart_aspdf_out
但 chrome 的跟踪显示以下内容,这似乎表明该函数至少被调用两次,如果不是三次的话。为什么会这样?
- cart_aspdf_in
- cart_aspdf_readfile
- cart_aspdf_out
- cart_aspdf_in
- cart_aspdf_readfile
- cart_aspdf_in
- cart_aspdf_readfile
- cart_aspdf_out
如果我省略了内容类型行但随后 chrome 显示了没有用的原始 pdf 数据,则不会出现此问题
最佳答案
我遇到了同样的问题。
header('Content-Disposition: inline;');
无论出于何种原因,当 content-disposition 是内联时,它会调用页面两次。
这让我在尝试使用引荐来源网址时遇到问题,因为第二次调用没有传递引荐来源网址数据。
使用
header('Content-Disposition: attachment;');
只运行一次,但不会在浏览器 PDF 查看器中显示。它将改为下载文件。
我认为这需要发布在 chrome 的 bugtracker 上。这非常烦人,并且对于流式传输文件来说是一种带宽浪费。
关于php - 内容类型导致 chrome 调用函数两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198085/