2017-08-26 58 views
0

我正在Symfony应用程序中用户可以裁剪图像。在有人下载了裁剪后的图像后,我希望应用程序将其从服务器中删除。Symfony下载后删除文件

我现在有这个控制器动作:

/** 
* @Route(
*  "/download/{crop_id}", 
*  name="download_cropped", 
*  options={"expose"=true} 
*) 
* 
* @ParamConverter(
*  "crop", 
*  class="WebwijsCropperBundle:Crop", 
*  options={"id" = "crop_id"} 
*) 
* 
*/ 
public function downloadAction(Crop $crop) 
{ 
    $dir = $this->container->getParameter('image.cropped.dir'); 
    return new BinaryFileResponse($dir . '/' . $crop->getCroppedFile()); 
} 

我创造了这个事件监听,我想发送的响应后删除图像。这个监听器会在每次响应后触发。

那么,如何获得我需要知道的信息,如果响应来自正确的控制器操作。我怎样才能得到crop_id参数,所以我知道要删除哪个文件?

class FileRemovalListener 
{ 
    private $logger; 

    public function __construct(LoggerInterface $logger) 
    { 
     $this->logger = $logger; 
    } 

    public function onKernelTerminate(PostResponseEvent $event) 
    { 
     $response = $event->getResponse(); 
     $request = $event->getRequest(); 
     // what do i have to do here to know 
     // from which controller action the response comes? 

    } 
} 

这是services.yml服务定义

WebwijsCropperBundle\EventListener\FileRemovalListener: 
     tags: 
      - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate } 
+0

创建一个新的deleteAction。然后定义重定向路由到deleteAction下载 – 2017-08-26 11:25:39

+0

后我会像去:如果用户点击下载按钮 ,您发送Ajax调用某种deleteAction'的'你转发ID 或 你给所有裁剪图像图像的生命周期,你有一个cron作业,可以删除所有已经过期的图像,每15分钟或类似的东西。 – kunicmarko20

回答

2

如果你只是想删除的文件,试试这个:

public function downloadAction(Crop $crop) 
{ 
    $dir = $this->container->getParameter('image.cropped.dir'); 
    $response = new BinaryFileResponse($dir . '/' . $crop->getCroppedFile()); 

    $response->deleteFileAfterSend(true); 

    return $response; 
} 
+0

对我有意义。我也需要删除实体,但我可以在发送响应之前做到这一点。我会尝试如果这对我有用,然后标记你的答案是正确的! –

+0

花了一段时间,我在度假。奇迹般有效! –

-1

使用

deleteFileAfterSend(bool $shouldDelete) 

如果这设置为true,则该文件将被取消链接请求发送后。 注意:如果使用X-Sendfile标题,则不会使用deleteFileAfterSend设置。