vendor/kunstmaan/media-bundle/Helper/File/FileHandler.php line 69

Open in your IDE?
  1. <?php
  2. namespace Kunstmaan\MediaBundle\Helper\File;
  3. use Gaufrette\Filesystem;
  4. use Kunstmaan\MediaBundle\Entity\Media;
  5. use Kunstmaan\MediaBundle\Form\File\FileType;
  6. use Kunstmaan\MediaBundle\Helper\ExtensionGuesserFactoryInterface;
  7. use Kunstmaan\MediaBundle\Helper\Media\AbstractMediaHandler;
  8. use Kunstmaan\MediaBundle\Helper\MimeTypeGuesserFactoryInterface;
  9. use Kunstmaan\UtilitiesBundle\Helper\SlugifierInterface;
  10. use Symfony\Component\HttpFoundation\File\File;
  11. use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesserInterface;
  12. use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface;
  13. use Symfony\Component\HttpFoundation\File\UploadedFile;
  14. /**
  15.  * FileHandler
  16.  */
  17. class FileHandler extends AbstractMediaHandler
  18. {
  19.     /**
  20.      * @var string
  21.      */
  22.     const TYPE 'file';
  23.     /**
  24.      * @var string
  25.      */
  26.     public $mediaPath;
  27.     /**
  28.      * @var Filesystem
  29.      */
  30.     public $fileSystem;
  31.     /**
  32.      * @var MimeTypeGuesserInterface
  33.      */
  34.     public $mimeTypeGuesser;
  35.     /**
  36.      * @var ExtensionGuesserInterface
  37.      */
  38.     public $extensionGuesser;
  39.     /**
  40.      * Files with a blacklisted extension will be converted to txt
  41.      *
  42.      * @var array
  43.      */
  44.     private $blacklistedExtensions = array();
  45.     /**
  46.      * @var SlugifierInterface
  47.      */
  48.     private $slugifier;
  49.     /**
  50.      * Constructor
  51.      *
  52.      * @param int                              $priority
  53.      * @param MimeTypeGuesserFactoryInterface  $mimeTypeGuesserFactory
  54.      * @param ExtensionGuesserFactoryInterface $extensionGuesserFactoryInterface
  55.      */
  56.     public function __construct($priorityMimeTypeGuesserFactoryInterface $mimeTypeGuesserFactoryExtensionGuesserFactoryInterface $extensionGuesserFactoryInterface)
  57.     {
  58.         parent::__construct($priority);
  59.         $this->mimeTypeGuesser $mimeTypeGuesserFactory->get();
  60.         $this->extensionGuesser $extensionGuesserFactoryInterface->get();
  61.     }
  62.     /**
  63.      * @param SlugifierInterface $slugifier
  64.      */
  65.     public function setSlugifier(SlugifierInterface $slugifier)
  66.     {
  67.         $this->slugifier $slugifier;
  68.     }
  69.     /**
  70.      * Inject the blacklisted
  71.      *
  72.      * @param array $blacklistedExtensions
  73.      */
  74.     public function setBlacklistedExtensions(array $blacklistedExtensions)
  75.     {
  76.         $this->blacklistedExtensions $blacklistedExtensions;
  77.     }
  78.     /**
  79.      * Inject the path used in media urls.
  80.      *
  81.      * @param string $mediaPath
  82.      */
  83.     public function setMediaPath($mediaPath)
  84.     {
  85.         $this->mediaPath $mediaPath;
  86.     }
  87.     public function setFileSystem(Filesystem $fileSystem)
  88.     {
  89.         $this->fileSystem $fileSystem;
  90.     }
  91.     /**
  92.      * @return string
  93.      */
  94.     public function getName()
  95.     {
  96.         return 'File Handler';
  97.     }
  98.     /**
  99.      * @return string
  100.      */
  101.     public function getType()
  102.     {
  103.         return FileHandler::TYPE;
  104.     }
  105.     /**
  106.      * @return string
  107.      */
  108.     public function getFormType()
  109.     {
  110.         return FileType::class;
  111.     }
  112.     /**
  113.      * @param mixed $object
  114.      *
  115.      * @return bool
  116.      */
  117.     public function canHandle($object)
  118.     {
  119.         if ($object instanceof File ||
  120.             ($object instanceof Media &&
  121.             (is_file($object->getContent()) || $object->getLocation() == 'local'))
  122.         ) {
  123.             return true;
  124.         }
  125.         return false;
  126.     }
  127.     /**
  128.      * @param Media $media
  129.      *
  130.      * @return FileHelper
  131.      */
  132.     public function getFormHelper(Media $media)
  133.     {
  134.         return new FileHelper($media);
  135.     }
  136.     /**
  137.      * @param Media $media
  138.      *
  139.      * @throws \RuntimeException when the file does not exist
  140.      */
  141.     public function prepareMedia(Media $media)
  142.     {
  143.         if (null === $media->getUuid()) {
  144.             $uuid uniqid();
  145.             $media->setUuid($uuid);
  146.         }
  147.         $content $media->getContent();
  148.         if (empty($content)) {
  149.             return;
  150.         }
  151.         if (!$content instanceof File) {
  152.             if (!is_file($content)) {
  153.                 throw new \RuntimeException('Invalid file');
  154.             }
  155.             $file = new File($content);
  156.             $media->setContent($file);
  157.         }
  158.         $contentType $this->mimeTypeGuesser->guess($content->getPathname());
  159.         if ($content instanceof UploadedFile) {
  160.             $pathInfo pathinfo($content->getClientOriginalName());
  161.             if (!\array_key_exists('extension'$pathInfo)) {
  162.                 $pathInfo['extension'] = $this->extensionGuesser->guess($contentType);
  163.             }
  164.             $media->setOriginalFilename($this->slugifier->slugify($pathInfo['filename']).'.'.$pathInfo['extension']);
  165.             $name $media->getName();
  166.             if (empty($name)) {
  167.                 $media->setName($media->getOriginalFilename());
  168.             }
  169.         }
  170.         $media->setContentType($contentType);
  171.         $media->setFileSize(filesize($media->getContent()));
  172.         $media->setUrl($this->mediaPath $this->getFilePath($media));
  173.         $media->setLocation('local');
  174.     }
  175.     /**
  176.      * @param Media $media
  177.      */
  178.     public function removeMedia(Media $media)
  179.     {
  180.         $adapter $this->fileSystem->getAdapter();
  181.         // Remove the file from filesystem
  182.         $fileKey $this->getFilePath($media);
  183.         if ($adapter->exists($fileKey)) {
  184.             $adapter->delete($fileKey);
  185.         }
  186.         // Remove the files containing folder if there's nothing left
  187.         $folderPath $this->getFileFolderPath($media);
  188.         if ($adapter->exists($folderPath) && $adapter->isDirectory($folderPath) && !empty($folderPath)) {
  189.             $allMyKeys $adapter->keys();
  190.             $everythingfromdir preg_grep('/'.$folderPath$allMyKeys);
  191.             if (\count($everythingfromdir) === 1) {
  192.                 $adapter->delete($folderPath);
  193.             }
  194.         }
  195.         $media->setRemovedFromFileSystem(true);
  196.     }
  197.     /**
  198.      * {@inheritdoc}
  199.      */
  200.     public function updateMedia(Media $media)
  201.     {
  202.         $this->saveMedia($media);
  203.     }
  204.     /**
  205.      * @param Media $media
  206.      */
  207.     public function saveMedia(Media $media)
  208.     {
  209.         if (!$media->getContent() instanceof File) {
  210.             return;
  211.         }
  212.         $originalFile $this->getOriginalFile($media);
  213.         $originalFile->setContent(file_get_contents($media->getContent()->getRealPath()));
  214.     }
  215.     /**
  216.      * @param Media $media
  217.      *
  218.      * @return \Gaufrette\File
  219.      */
  220.     public function getOriginalFile(Media $media)
  221.     {
  222.         return $this->fileSystem->get($this->getFilePath($media), true);
  223.     }
  224.     /**
  225.      * @param mixed $data
  226.      *
  227.      * @return Media
  228.      */
  229.     public function createNew($data)
  230.     {
  231.         if ($data instanceof File) {
  232.             /** @var $data File */
  233.             $media = new Media();
  234.             if (method_exists($data'getClientOriginalName')) {
  235.                 $media->setOriginalFilename($data->getClientOriginalName());
  236.             } else {
  237.                 $media->setOriginalFilename($data->getFilename());
  238.             }
  239.             $media->setContent($data);
  240.             $contentType $this->mimeTypeGuesser->guess($media->getContent()->getPathname());
  241.             $media->setContentType($contentType);
  242.             return $media;
  243.         }
  244.         return null;
  245.     }
  246.     /**
  247.      * {@inheritdoc}
  248.      */
  249.     public function getShowTemplate(Media $media)
  250.     {
  251.         return '@KunstmaanMedia/Media/File/show.html.twig';
  252.     }
  253.     /**
  254.      * @return array
  255.      */
  256.     public function getAddFolderActions()
  257.     {
  258.         return array(
  259.             FileHandler::TYPE => array(
  260.                 'type' => FileHandler::TYPE,
  261.                 'name' => 'media.file.add',
  262.             ),
  263.         );
  264.     }
  265.     /**
  266.      * @param Media $media
  267.      *
  268.      * @return string
  269.      */
  270.     private function getFilePath(Media $media)
  271.     {
  272.         $filename $media->getOriginalFilename();
  273.         $filename str_replace(array('/''\\''%'), ''$filename);
  274.         if (!empty($this->blacklistedExtensions)) {
  275.             $filename preg_replace('/\.('.implode('|'$this->blacklistedExtensions).')$/''.txt'$filename);
  276.         }
  277.         $parts pathinfo($filename);
  278.         $filename $this->slugifier->slugify($parts['filename']);
  279.         if (\array_key_exists('extension'$parts)) {
  280.             $filename .= '.'.strtolower($parts['extension']);
  281.         }
  282.         return sprintf(
  283.             '%s/%s',
  284.             $media->getUuid(),
  285.             $filename
  286.         );
  287.     }
  288.     /**
  289.      * @param Media $media
  290.      *
  291.      * @return string
  292.      */
  293.     private function getFileFolderPath(Media $media)
  294.     {
  295.         return substr($this->getFilePath($media), 0strrpos($this->getFilePath($media), $media->getOriginalFilename()));
  296.     }
  297. }