2013-03-06 27 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);