# FileBinaryMimeTypeGuesser

class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface

Guesses the mime type with the binary "file" (only available on *nix).

## Methods

`public` | `` | `__construct(string $cmd = 'file -b --mime %s 2>/dev/null')` | The $cmd pattern must contain a "%s" string that will be replaced with the file name to guess. |
`public static` | `bool` | `isSupported()` | Returns whether this guesser is supported on the current OS. |
`public` | `string` | `guess(string $path)` | Guesses the mime type of the file with the given path. |

## Details

at line 34

### `__construct()`

`public __construct(string $cmd = 'file -b --mime %s 2>/dev/null')`

The $cmd pattern must contain a "%s" string that will be replaced with the file name to guess.

The command output must start with the mime type of the file.

#### Parameters

`string` | `$cmd` | The command to run to get the mime type of a file

at line 44

### `isSupported()`

`public static bool isSupported()`

Returns whether this guesser is supported on the current OS.

#### Return Value

`bool` |

at line 66

### `guess()`

`public string guess(string $path)`

Guesses the mime type of the file with the given path.

#### Parameters

`string` | `$path` | The path to the file

#### Return Value

`string` | The mime type or NULL, if none could be guessed

#### Exceptions

FileNotFoundException | If the file does not exist
AccessDeniedException | If the file could not be read

## Source code

    <?php

    /*
     * This file is part of the Symfony package.
     *
     * (c) Fabien Potencier <fabien@symfony.com>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */

    namespace Symfony\Component\HttpFoundation\File\MimeType;

    use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
    use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;

    /**
     * Guesses the mime type with the binary "file" (only available on *nix).
     *
     * @author Bernhard Schussek <bschussek@gmail.com>
     */
    class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
    {
        private $cmd;

        /**
         * The $cmd pattern must contain a "%s" string that will be replaced
         * with the file name to guess.
         *
         * The command output must start with the mime type of the file.
         *
         * @param string $cmd The command to run to get the mime type of a file
         */
        public function __construct(string $cmd = 'file -b --mime %s 2>/dev/null')
        {
            $this->cmd = $cmd;
        }

        /**
         * Returns whether this guesser is supported on the current OS.
         *
         * @return bool
         */
        public static function isSupported()
        {
            static $supported = null;

            if (null !== $supported) {
                return $supported;
            }

            if ('\\' === DIRECTORY_SEPARATOR || !function_exists('passthru') || !function_exists('escapeshellarg')) {
                return $supported = false;
            }

            ob_start();
            passthru('command -v file', $exitStatus);
            $binPath = trim(ob_get_clean());

            return $supported = 0 === $exitStatus && '' !== $binPath;
        }

        /**
         * {@inheritdoc}
         */
        public function guess($path)
        {
            if (!is_file($path)) {
                throw new FileNotFoundException($path);
            }

            if (!is_readable($path)) {
                throw new AccessDeniedException($path);
            }

            if (!self::isSupported()) {
                return;
            }

            ob_start();

            // need to use --mime instead of -i. see #6641
            passthru(sprintf($this->cmd, escapeshellarg($path)), $return);
            if ($return > 0) {
                ob_end_clean();

                return;
            }

            $type = trim(ob_get_clean());

            if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
                // it's not a type, but an error message
                return;
            }

            return $match[1];
        }
    }