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

sha*_*ter 3 php symfony silex

我在我的Silex应用程序中使用Knp\Snappy\Pdf生成pdf.文件名是随机的并保存到tmp目录中.

$filename = "/tmp/$random.pdf"
$snappy->generate('/tmp/body.html', $filename, array(), true);
Run Code Online (Sandbox Code Playgroud)

我想在回复中返回pdf,

$response = new Response(file_get_contents($filename));
$response->headers->set('Pragma', 'public');
$response->headers->set('Content-Type', 'application/pdf');

return $response;
Run Code Online (Sandbox Code Playgroud)

pdf正确显示在Web浏览器中.请求完成后,具有随机文件名的文件仍然存在.在返回响应之前,我无法取消链接文件.我已经尝试使用register_shutdown_function注册一个关闭函数并从那里取消链接文件.然而,这似乎不起作用.有任何想法吗?

小智 12

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

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

    return $app ->sendFile($filepath)
                ->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, $fileName)
                ->deleteFileAfterSend(true);
Run Code Online (Sandbox Code Playgroud)


Mae*_*lyn 5

您可以使用完成中间件:

完成应用程序中间件允许您在将响应发送到客户端后执行任务(如发送电子邮件或记录)

这是它的外观:

$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;
Run Code Online (Sandbox Code Playgroud)