某些浏览器在显示下载对话框之前等待实际内容.
因此,解决方案很简单:在创建PDF内容之前发送一些PDF内容.
等一下.
在你拥有之前你怎么发送东西?
这听起来像需要时间机器,对吗?
别担心,有办法绕过它.
PDF content starts with %PDF,因此您只需在调用flush()之前发送%PDF.
PDF创建完成后,在回显之前删除新创建的PDF内容的前4个字节.
// disable output buffering
while (@ob_end_clean());
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename=test.pdf');
// send some content to trigger the download dialog
echo '%PDF';
flush();
// time consuming PDF creation happens here
sleep(15);
$pdfContent = '%PDF-pdf contents would be here';
echo substr($pdfContent, 4);
此解决方案适用于任何语言,因为它不依赖于任何仅PHP的功能.
如果要进行绝对最小值,还可以发送1个字节%,然后在回显之前仅删除第一个字节.结果相同.