代码之家  ›  专栏  ›  技术社区  ›  jrswgtr Kushal Chavan

下载后删除文件

  •  5
  • jrswgtr Kushal Chavan  · 技术社区  · 9 年前

    我目前有以下控制器操作:

    /**
     * @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\u 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?
    
        }
    }
    

    这是服务中的服务定义。yml公司

    WebwijsCropperBundle\EventListener\FileRemovalListener:
            tags:
                - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate }
    
    3 回复  |  直到 9 年前
        1
  •  18
  •   miikes    9 年前

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

    public function downloadAction(Crop $crop)
    {
        $dir = $this->container->getParameter('image.cropped.dir');
        $response = new BinaryFileResponse($dir . '/' . $crop->getCroppedFile());
    
        $response->deleteFileAfterSend(true);
    
        return $response;
    }
    
        2
  •  1
  •   T. Abdelmalek    9 年前

    deleteFileAfterSend(bool $shouldDelete)
    

    注意:如果使用X-Sendfile头,则不会使用deleteFileAfterSend设置。

        3
  •  0
  •   Pierre Alexaline    4 年前

    函数“deleteFileAfterSend(bool$bool)”的精度。正如symfony文件所述 . https://symfony.com/doc/current/components/http_foundation.html#serving-files .

    $zipName = 'downloads/' . uniqid().'.zip';
    $response = new StreamedResponse();
    $response->headers->set(...);
    
    return $response->setCallBack(function () use($zipName) {
        readfile($zipName);
        $filesystem = new Filesystem();
        try {
           $filesystem->remove($zipName);
        } catch (IOExceptionInterface $exception) {
            echo "Cannot delete the zip file : ". $zipName;
        }
    });