使用Silex / Symfony提交响应后删除文件

时间:2013-03-06 04:17:26

标签: php symfony silex

我在我的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注册一个关闭函数并从那里取消链接文件。然而,这似乎不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:12)

尽管这已经过时了,但是如果有人像我一样最近搜索谷歌。这是我找到的解决方案。

在Silex中从BinaryFileResponse返回的sendFile上有一个deleteFileAfterSend()方法。 所以在你的控制器中你可以做到:

    return $app ->sendFile($filepath)
                ->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, $fileName)
                ->deleteFileAfterSend(true);

答案 1 :(得分: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;

答案 2 :(得分:3)

Maerlyn是对的,但在这种情况下,您还可以在返回响应之前取消链接文件,因为该文件的内容已经在$ response中。