Symfony下载后删除文件

时间:2017-08-26 10:40:20

标签: php 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());
}

我创建了这个EventListener,我希望在发送响应后删除图像。每次响应后都会触发此监听器。

那么,如果响应来自正确的控制器操作,我如何获取需要知道的信息。我如何获取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 }

2 个答案:

答案 0 :(得分:7)

如果您只想删除该文件,请尝试以下操作:

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

    $response->deleteFileAfterSend(true);

    return $response;
}

答案 1 :(得分:1)

使用

deleteFileAfterSend(bool $shouldDelete)

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