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


Removing file after delivering response with Silex/Symfony

我在我的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中了。