我在我的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注册一个关机函数,并从那里解除文件的链接。然而,这似乎不起作用。什么好主意吗?
虽然这是旧的,但如果有人像我一样最近谷歌这个。这是我找到的解决方案。
在Silex中从sendFile返回的binaryfilerresponse上有一个deleteFileAfterSend()方法。在控制器中你可以输入: return $app ->sendFile($filepath)
->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, $fileName)
->deleteFileAfterSend(true);
您可以使用完成中间件:
完成应用程序中间件允许您在响应被发送到客户端(如发送电子邮件或日志)之后执行任务
它看起来是这样的:
$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;
Maerlyn是对的,但是在这种情况下,您也可以在返回响应之前取消文件链接,因为文件的内容已经在$response中了。