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