vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php line 18

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\HttpFoundation\File\MimeType;
  11. use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
  12. use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
  13. use Symfony\Component\Mime\FileBinaryMimeTypeGuesser as NewFileBinaryMimeTypeGuesser;
  14. @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" instead.'FileBinaryMimeTypeGuesser::class, NewFileBinaryMimeTypeGuesser::class), \E_USER_DEPRECATED);
  15. /**
  16.  * Guesses the mime type with the binary "file" (only available on *nix).
  17.  *
  18.  * @author Bernhard Schussek <bschussek@gmail.com>
  19.  *
  20.  * @deprecated since Symfony 4.3, use {@link NewFileBinaryMimeTypeGuesser} instead
  21.  */
  22. class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
  23. {
  24.     private $cmd;
  25.     /**
  26.      * The $cmd pattern must contain a "%s" string that will be replaced
  27.      * with the file name to guess.
  28.      *
  29.      * The command output must start with the mime type of the file.
  30.      *
  31.      * @param string $cmd The command to run to get the mime type of a file
  32.      */
  33.     public function __construct(string $cmd 'file -b --mime -- %s 2>/dev/null')
  34.     {
  35.         $this->cmd $cmd;
  36.     }
  37.     /**
  38.      * Returns whether this guesser is supported on the current OS.
  39.      *
  40.      * @return bool
  41.      */
  42.     public static function isSupported()
  43.     {
  44.         static $supported null;
  45.         if (null !== $supported) {
  46.             return $supported;
  47.         }
  48.         if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('passthru') || !\function_exists('escapeshellarg')) {
  49.             return $supported false;
  50.         }
  51.         ob_start();
  52.         passthru('command -v file'$exitStatus);
  53.         $binPath trim(ob_get_clean());
  54.         return $supported === $exitStatus && '' !== $binPath;
  55.     }
  56.     /**
  57.      * {@inheritdoc}
  58.      */
  59.     public function guess($path)
  60.     {
  61.         if (!is_file($path)) {
  62.             throw new FileNotFoundException($path);
  63.         }
  64.         if (!is_readable($path)) {
  65.             throw new AccessDeniedException($path);
  66.         }
  67.         if (!self::isSupported()) {
  68.             return null;
  69.         }
  70.         ob_start();
  71.         // need to use --mime instead of -i. see #6641
  72.         passthru(sprintf($this->cmdescapeshellarg((str_starts_with($path'-') ? './' '').$path)), $return);
  73.         if ($return 0) {
  74.             ob_end_clean();
  75.             return null;
  76.         }
  77.         $type trim(ob_get_clean());
  78.         if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\+\.]+)#i'$type$match)) {
  79.             // it's not a type, but an error message
  80.             return null;
  81.         }
  82.         return $match[1];
  83.     }
  84. }