Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/FileWrapper.php
<?php

namespace XF;

use function
strlen;

class
FileWrapper
{
    protected
$filePath;
    protected
$fileSize;
    protected
$fileName;
    protected
$extension;

    protected
$isImage = null;
    protected
$imageInfo = null;
    protected
$exif = null;

    public function
__construct($filePath, $fileName = '')
    {
        if (!
file_exists($filePath) || !is_readable($filePath))
        {
            throw new \
InvalidArgumentException("File '$filePath' can not be read or found");
        }

       
$this->filePath = $filePath;
       
clearstatcache();
       
$this->fileSize = filesize($filePath);
       
$this->setFileName(strlen($fileName) ? $fileName : basename($filePath));
    }

    public function
getFilePath()
    {
        return
$this->filePath;
    }

    public function
getFileSize()
    {
        return
$this->fileSize;
    }

    public function
setFileName($fileName)
    {
        if (!
strlen($fileName))
        {
            throw new \
InvalidArgumentException("A file name must be provided");
        }

       
$this->fileName = $fileName;
       
$this->extension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
    }

    public function
getFileName()
    {
        return
$this->fileName;
    }

    public function
getExtension()
    {
        return
$this->extension;
    }

    public function
isImage()
    {
        if (
$this->isImage === null)
        {
           
$this->analyzeImage();
        }

        return
$this->isImage;
    }

    public function
getImageType()
    {
        return
$this->isImage() ? $this->imageInfo[2] : null;
    }

    public function
getImageWidth()
    {
        return
$this->isImage() ? $this->imageInfo[0] : 0;
    }

    public function
getImageHeight()
    {
        return
$this->isImage() ? $this->imageInfo[1] : 0;
    }

    protected function
analyzeImage()
    {
       
$this->isImage = false;

        if (!
$this->fileSize)
        {
            return;
        }

       
$map = $this->getImageExtensionMap();
        if (!isset(
$map[$this->extension]))
        {
           
// require image extension to even try anything
           
return;
        }

       
$imageInfo = @getimagesize($this->filePath);
        if (!
$imageInfo)
        {
            return;
        }

       
$imageType = $imageInfo[2];
        switch (
$imageType)
        {
            case
IMAGETYPE_GIF:
            case
IMAGETYPE_JPEG:
            case
IMAGETYPE_PNG:
                break;

            default:
                return;
        }

        if (
$imageType != $map[$this->extension])
        {
            foreach (
$map AS $newExtension => $extensionType)
            {
                if (
$imageType == $extensionType)
                {
                   
$this->fileName .= ".$newExtension";
                    break;
                }
            }
        }

       
$this->isImage = true;
       
$this->imageInfo = $imageInfo;
    }

    public function
getExif()
    {
        if (
$this->getImageType() === IMAGETYPE_JPEG)
        {
            if (
$this->exif === null)
            {
               
$exif = null;
                if (
function_exists('exif_read_data'))
                {
                    @
ini_set('exif.encode_unicode', 'UTF-8');
                   
$exif = @exif_read_data($this->filePath, null, true);
                }
               
$this->exif = $exif ?: [];
            }

            return
$this->exif;
        }
        else
        {
            return [];
        }
    }

    public function
setExif(array $exif)
    {
       
$this->exif = $exif;
    }

    protected function
getImageExtensionMap()
    {
        return [
           
'gif' => IMAGETYPE_GIF,
           
'jpg' => IMAGETYPE_JPEG,
           
'jpeg' => IMAGETYPE_JPEG,
           
'jpe' => IMAGETYPE_JPEG,
           
'png' => IMAGETYPE_PNG
       
];
    }
}