vendor/ibexa/image-editor/src/bundle/Event/Base64ResponseSubscriber.php line 52

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\Bundle\ImageEditor\Event;
  8. use Ibexa\Bundle\ImageEditor\Controller\Base64Controller;
  9. use Ibexa\Core\FieldType\Image\Value;
  10. use Ibexa\Core\IO\IOServiceInterface;
  11. use Ibexa\Core\IO\Values\BinaryFile;
  12. use Ibexa\ImageEditor\Output\Base64File;
  13. use Ibexa\ImageEditor\Response\Base64Response;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  18. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  19. use Symfony\Component\HttpKernel\Event\ViewEvent;
  20. use Symfony\Component\HttpKernel\KernelEvents;
  21. final class Base64ResponseSubscriber implements EventSubscriberInterface
  22. {
  23.     /** @var \Ibexa\Core\IO\IOServiceInterface */
  24.     private $ioService;
  25.     public function __construct(
  26.         IOServiceInterface $ioService
  27.     ) {
  28.         $this->ioService $ioService;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             KernelEvents::VIEW => 'onView',
  34.             KernelEvents::CONTROLLER => 'onKernelController',
  35.         ];
  36.     }
  37.     public function onKernelController(ControllerEvent $event): void
  38.     {
  39.         $controller $event->getController();
  40.         if (is_array($controller) && $controller[0] instanceof Base64Controller) {
  41.             $event->getRequest()->attributes->set('base_64_required'true);
  42.         }
  43.     }
  44.     public function onView(ViewEvent $event): void
  45.     {
  46.         $value $event->getControllerResult();
  47.         if ($event->getRequest()->attributes->get('base_64_required') !== true) {
  48.             return;
  49.         }
  50.         if (!$value instanceof Value) {
  51.             return;
  52.         }
  53.         $file $this->ioService->loadBinaryFile($value->id);
  54.         $requestedType $event->getRequest()->headers->get('Accept''');
  55.         $response = new Response();
  56.         if ($requestedType === '' || $requestedType === 'application/octet-stream') {
  57.             $response = new Base64Response($file$this->ioService);
  58.             $response->setContentDisposition(
  59.                 ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  60.                 $value->fileName
  61.             );
  62.         }
  63.         if ($requestedType === 'application/json') {
  64.             $response = new JsonResponse(
  65.                 new Base64File(
  66.                     $this->buildBase64($file),
  67.                     $value->fileName
  68.                 )
  69.             );
  70.         }
  71.         $event->setResponse($response);
  72.     }
  73.     private function buildBase64(BinaryFile $binaryFile): string
  74.     {
  75.         return sprintf(
  76.             'data:%s;base64,%s',
  77.             $this->ioService->getMimeType($binaryFile->id),
  78.             base64_encode($this->ioService->getFileContents($binaryFile))
  79.         );
  80.     }
  81. }
  82. class_alias(Base64ResponseSubscriber::class, 'Ibexa\Platform\Bundle\ImageEditor\Event\Base64ResponseSubscriber');