0

私の質問

PDFを「1回限り」として生成するスクリプトがあります。次に、スクリプトがファイルを読み取り、ブラウザに送信します。

私が抱えている問題は、ファイルがブラウザに正常に送信されたら、ファイルを削除する必要があることです。

ユーザーがファイルを完全にダウンロードしたかどうかを検出する際に問題が発生する可能性があることはわかっています。これが、この質問をしている理由です...

ファイルをブラウザに送信し、クライアントのブラウザ/コンピュータに完全に送信/ダウンロードされたら削除する信頼できる方法はありますか?

私の研究

私は多くのことを調べましたが、これは不可能かもしれないことがわかります。次の質問は、このトピックに関する情報を少し提供しました。

  1. ajax呼び出し後にPDFをブラウザに送信
  2. ユーザーがダウンロードした後にファイルを削除する

ignore_user_abortこれらの質問は両方とも、etcを使用すればできると言っているのと、できないと言っているのとで矛盾しているようです...

別の潜在的な解決策は、単純に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 ファイルでテストしましたが、動作するので、上記の解決策は実際には正しいかもしれません。誰かがこの方法で隠された問題を共有したり、見たりしたい場合は、他の考えをいただければ幸いです.

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 に答える