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];
    }
}