读取文件并将其发送到浏览器然后删除

时间:2013-09-10 14:14:03

标签: php pdf download

我的问题

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

我遇到的问题是,我需要在文件成功发送到浏览器后删除该文件。

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

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

我的研究

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

  1. send pdf to browser after ajax call
  2. deleting a file after user download it
  3. 这两个问题似乎互相矛盾,有人说如果你使用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文件对其进行了测试,但它确实有效,因此上述解决方案可能实际上是正确的。如果有人愿意分享或者可以看到这种方法的任何隐藏问题,我仍然会感激任何其他想法。

1 个答案:

答案 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");