简体   繁体   中英

Get MIME-type by URL

Fore example exif_imagetype() works fine

<?php echo exif_imagetype('http://orig01.deviantart.net/ace1/f/2010/227/4/6/png_test_by_destron23.png');

But finfo_file() does not work.

<?php echo finfo_file(finfo_open(FILEINFO_MIME), 'http://orig01.deviantart.net/ace1/f/2010/227/4/6/png_test_by_destron23.png'); 

and got

Warning: finfo_file(): Failed identify data 0:(null) in /test.php on line 1

Any thoughts?

It is need to stream_wrapper_register()

class MimeStreamWrapper
{
    const WRAPPER_NAME = 'mime';

    /**
     * @var resource
     */
    public $context;

    /**
     * @var bool
     */
    private static $isRegistered = false;

    /**
     * @var callable
     */
    private $callBackFunction;

    /**
     * @var bool
     */
    private $eof = false;

    /**
     * @var resource
     */
    private $fp;

    /**
     * @var string
     */
    private $path;

    /**
     * @var array
     */
    private $fileStat;

    /**
     * @return array
     */
    private function getStat()
    {
        if ($fStat = fstat($this->fp)) {
            return $fStat;
        }

        $size = 100;
        if ($headers = get_headers($this->path, true)) {
            $head = array_change_key_case($headers, CASE_LOWER);
            $size = (int)$head['content-length'];
        }
        $blocks = ceil($size / 512);
        return array(
            'dev' => 16777220,
            'ino' => 15764,
            'mode' => 33188,
            'nlink' => 1,
            'uid' => 10000,
            'gid' => 80,
            'rdev' => 0,
            'size' => $size,
            'atime' => 0,
            'mtime' => 0,
            'ctime' => 0,
            'blksize' => 4096,
            'blocks' => $blocks,
        );
    }

    /**
     * @param string $path
     */
    public function setPath($path)
    {
        $this->path = $path;
        $this->fp = fopen($this->path, 'rb') or die('Cannot open file:  ' . $this->path);
        $this->fileStat = $this->getStat();
    }

    /**
     * @param int $count
     * @return string
     */
    public function read($count) {
        return fread($this->fp, $count);
    }

    /**
     * @return string
     */

    public function getStreamPath()
    {
        return str_replace(array('ftp://', 'http://', 'https://'), self::WRAPPER_NAME . '://', $this->path);
    }

    /**
     * @return resource
     */
    public function getContext()
    {
        if (!self::$isRegistered) {
            stream_wrapper_register(self::WRAPPER_NAME, get_class());
            self::$isRegistered = true;
        }
        return stream_context_create(
            array(
                self::WRAPPER_NAME => array(
                    'cb' => array($this, 'read'),
                    'fileStat' => $this->fileStat,
                )
            )
        );
    }

    /**
     * @param $path
     * @param $mode
     * @param $options
     * @param $opened_path
     * @return bool
     */
    public function stream_open($path, $mode, $options, &$opened_path)
    {
        if (!preg_match('/^r[bt]?$/', $mode) || !$this->context) {
            return false;
        }
        $opt = stream_context_get_options($this->context);
        if (!is_array($opt[self::WRAPPER_NAME]) ||
            !isset($opt[self::WRAPPER_NAME]['cb']) ||
            !is_callable($opt[self::WRAPPER_NAME]['cb'])
        ) {
            return false;
        }
        $this->callBackFunction = $opt[self::WRAPPER_NAME]['cb'];
        $this->fileStat = $opt[self::WRAPPER_NAME]['fileStat'];

        return true;
    }

    /**
     * @param int $count
     * @return mixed|string
     */
    public function stream_read($count)
    {
        if ($this->eof || !$count) {
            return '';
        }
        if (($s = call_user_func($this->callBackFunction, $count)) == '') {
            $this->eof = true;
        }
        return $s;
    }

    /**
     * @return bool
     */
    public function stream_eof()
    {
        return $this->eof;
    }

    /**
     * @return array
     */
    public function stream_stat()
    {
        return $this->fileStat;
    }

    /**
     * @param int $castAs
     *
     * @return resource
     */
    public function stream_cast($castAs)
    {
        $read = null;
        $write  = null;
        $except = null;
        return @stream_select($read, $write, $except, $castAs);
    }
}

//$path = 'ftp://ftp.happy.kiev.ua/pub/pictures/ksyu/15.TIF';
//$path = 'ftp://ftp.happy.kiev.ua/pub/pictures/arcwolf1.gif';
//$path = 'ftp://ftp.happy.kiev.ua/pub/pictures/pub_k.pcx';
//$path = 'ftp://ftp.happy.kiev.ua/pub/pictures/9427.jpg';
//$path = 'https://homepages.cae.wisc.edu/~ece533/images/airplane.png';
//$path = '/etc/hosts';

$path = 'http://fc04.deviantart.net/fs71/f/2010/227/4/6/PNG_Test_by_Destron23.png';
echo "File: ", $path, "\n";
$wrapper = new MimeStreamWrapper();
$wrapper->setPath($path);

$fInfo = new finfo(FILEINFO_MIME);
echo "MIME-type: ", $fInfo->file($wrapper->getStreamPath(), FILEINFO_MIME_TYPE, $wrapper->getContext()), "\n";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM