0

我的问题

我有一个脚本可以将 PDF 生成为“一次性”。然后我的脚本读取文件并将其发送到浏览器。

我遇到的问题是,一旦文件成功发送到浏览器,我就需要删除它。

我知道检测用户是否已完全下载文件可能存在问题,这就是我问这个问题的原因......

是否有可靠的方法将文件发送到浏览器,然后在完全发送/下载到客户端浏览器/计算机后将其删除?

我的研究

我已经搜索了很多,可以看到这可能是不可能的。以下问题提供了有关该主题的一些信息:

  1. ajax调用后将pdf发送到浏览器
  2. 用户下载后删除文件

这两个问题似乎相互矛盾,一个说如果你使用ignore_user_abortetc 就可以做到,另一个说不能做到......

我知道另一个潜在的解决方案是简单地运行一个 cronjob/scheduled 任务来删除任何超过 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 文件对此进行了测试,它确实有效,因此上述解决方案实际上可能是正确的。如果有人希望分享或可以看到此方法的任何隐藏问题,我仍然会很感激任何其他想法。

4

1 回答 1

0

这可能是一件愚蠢的事情。但是大多数 PDF 生成库都有流选项。

所以你的 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");  
于 2013-09-10T15:09:04.863 回答