2013-03-06 88 views
3

我在Silex应用程序中使用Knp \ Snappy \ Pdf生成pdf。文件名是随机的并保存到tmp目录。用Silex/Symfony发送响应后删除文件

$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注册一个关闭函数,并从那里取消链接文件。但是,这似乎并不奏效。有任何想法吗?

+2

你应该使用'BinaryFileResponse'的文件,它需要照顾的头给你。 – leftclickben 2013-03-06 04:56:13

回答

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; 
+0

当然!谢了哥们。 – shapeshifter 2013-03-06 06:28:03

3

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

12

即使这是旧的,如果有人像我这样最近使用谷歌搜索这一点。这是我找到的解决方案。

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

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