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 正确显示在网络浏览器中。请求完成后,具有随机文件名的文件仍然存在。在返回响应之前,我无法取消链接文件。我尝试使用 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

您可以为此使用完成中间件:

完成应用程序中间件允许您在将响应发送到客户端后执行任务(例如发送电子邮件或日志记录)

这就是它的外观:

$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.xml 中。

于 2013-03-08T07:51:03.500 回答