我有一个脚本可以生成PDF作为“一次性”。然后我的脚本读取文件并将其发送到浏览器。
我遇到的问题是,我需要在文件成功发送到浏览器后删除该文件。
我知道检测用户是否已完全下载文件存在问题,这就是我提出这个问题的原因......
是否有可靠的方法将文件发送到浏览器,然后在完全发送/下载到客户端浏览器/计算机后将其删除?
我搜索了很多,可以看出这可能是不可能的。以下问题提供了有关该主题的一些信息:
这两个问题似乎互相矛盾,有人说如果你使用ignore_user_abort
等就可以做到,而另一个说不能做到......
我知道另一个可能的解决方案是简单地运行一个cronjob /预定任务来删除任何超过X分钟的文件...我将采用这个作为我的最后一个选项
到目前为止,我已经玩了一些东西,但还没有任何工作......我的代码看起来像这样:
// Set the headers to PDF
header('Content-type: application/pdf');
// Read the file and send it to the browser
readfile($this->paths['WWW'].'/test.pdf');
// Delete the file
unlink($this->paths['WWW'].'/test.pdf');
我刚刚重新测试了我的代码,它看起来工作得很好......文件上存在权限错误,所以当我调用unlink
时它没有删除。
但是,我仍然对使用这种方法有点谨慎。我可以确定文件将在发送后发送然后删除吗?
我已经使用大型PDF文件对其进行了测试,但它确实有效,因此上述解决方案可能实际上是正确的。如果有人愿意分享或者可以看到这种方法的任何隐藏问题,我仍然会感激任何其他想法。
答案 0 :(得分:0)
这可能是个愚蠢的事情。但是大多数PDF Gernerating库都有一个流选项。
所以你的url语法是steampdf.php?id = 12。这会输出一个文件名My_Super_Duper_pdf.pdf,就是它。
TCPDF的示例
//Databaselogic goes here
$db->select_all_records_and_merge_the_pdf();
$pdf = new PDF();
$pdf->SetMargins(PDF_MARGIN_LEFT, 40, PDF_MARGIN_RIGHT);
$pdf->SetAutoPageBreak(true, 40);
$pdf->setFontSubsetting(false);
//do pdf logic:
$tblHeading = '<table>
<tr>
<td colspan="2" style="font-family: ralewaybold; font-size: 16pt;">Factuur</td>
</tr>
<tr>
<td style="font-family: ralewayreg; font-size: 12pt;">x:</td>
<td style="font-family: ralewayreg; font-size: 12pt;">'.$varInvoiceNumber.'</td>
</tr>
<tr>
<td style="font-family: ralewayreg; font-size: 12pt;">x:</td>
<td style="font-family: ralewayreg; font-size: 12pt;">'.$varInvoiceDate.'</td>
</tr>
</table>';
$pdf->writeHTMLCell(100, 40, 20, 100.5, $tblHeading);
// add a page
$pdf->AddPage();
return $pdf->Output("My_Super_Duper_pdf.pdf","S");