3

Silex アプリケーションで Knp\Snappy\Pdf を使用して pdf を生成しています。ファイル名はランダムで、tmp ディレクトリに保存されます。

$filename = "/tmp/$random.pdf"
$snappy->generate('/tmp/body.html', $filename, array(), true);

応答でpdfを返すと思いますが、

$response = new Response(file_get_contents($filename));
$response->headers->set('Pragma', 'public');
$response->headers->set('Content-Type', 'application/pdf');

return $response;

pdf は Web ブラウザーで正しく表示されます。要求が終了しても、ランダムなファイル名を持つファイルはまだ存在しています。応答を返す前にファイルのリンクを解除できません。register_shutdown_function でシャットダウン関数を登録し、そこからファイルのリンクを解除しようとしました。しかし、それはうまくいかないようです。何か案は?

4

3 に答える 3

12

これは古いものですが、私のように最近誰かがこれをグーグルで調べていると思います. これが私が見つけた解決策です。

Silex のsendFileから返されたBinaryFileResponseには、deleteFileAfterSend() メソッドがあります。したがって、コントローラーで次のことができます。

    return $app ->sendFile($filepath)
                ->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, $fileName)
                ->deleteFileAfterSend(true);
于 2016-02-10T18:40:19.780 に答える
5

そのためには、 finishミドルウェアを使用できます。

仕上げアプリケーション ミドルウェアを使用すると、応答がクライアントに送信された後にタスクを実行できます (電子メールの送信やログ記録など)。

これはどのように見えるかです:

$app->finish(function (Request $request, Response $response) use ($app) {
    if (isset($app["file_to_remove"])) {
        unlink($app["file_to_remove"];
    }
});

//in your controller
$app["file_to_remove"] = $filename;
于 2013-03-06T05:15:53.540 に答える
3

Maerlyn の言うとおりですが、この場合、ファイルの内容は既に $response にあるため、応答を返す前にファイルのリンクを解除することもできます。

于 2013-03-08T07:51:03.500 に答える