Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
28.57% covered (danger)
28.57%
4 / 14
CRAP
22.03% covered (danger)
22.03%
13 / 59
Image
0.00% covered (danger)
0.00%
0 / 1
28.57% covered (danger)
28.57%
4 / 14
486.45
22.03% covered (danger)
22.03%
13 / 59
 __construct(FAPI $storageAPI, $location)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
6 / 6
 setSizeLimit($sizeLimit)
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 setLocation($location)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setMaxResolution($maxResolution)
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 setOptions($options)
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 4
 getLocation()
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 upload($fileToUpload, $user, $fileName = null)
0.00% covered (danger)
0.00%
0 / 1
90
0.00% covered (danger)
0.00%
0 / 17
 getLastUploadId()
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 updateNameDescription($fileName, $imageName, $imageDescription)
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 getImageByFileName($fileName)
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 4
 delete($user, $imageId)
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 6
 _createDbEntry($user, $fileName = null)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
2 / 2
 getFullPath($fileName = null)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 _changeResolution($fileToUpload)
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 6
<?php
/**
 * Image uploads an image file and creates a database entry.
 */
namespace aae\app {
    use \aae\db\FunctionAPI as FAPI;
    /**
     * @author Axel Ancona Esselmann <axel@anconaesselmann.com>
     * @package aae\app
     */
    class Image {
        protected $_storageAPI, $_location, $_sizeLimit, $_lastUploadId;
        public function __construct(FAPI $storageAPI, $location) {
            $this->_storageAPI    = $storageAPI;
            $this->setLocation($location);
            $this->_sizeLimit     = 500000;
            $this->_maxResolution = null;
            $this->_lastUploadId = null;
        }
        public function setSizeLimit($sizeLimit) {
            $iniMax = (int)strstr(ini_get('upload_max_filesize'), "M", true) * 1024 * 1024;
            if ($iniMax < $sizeLimit) throw new \Exception("php ini max for file upload is ".$iniMax." bytes (".($iniMax / 1024 / 1024)."MB), trying to set a max image size of ".$sizeLimit." bytes(".($sizeLimit / 1024 / 1024)." MB)", 313151902);
            $this->_sizeLimit = $sizeLimit;
        }
        public function setLocation($location) {
            $this->_location = $location;
        }
        public function setMaxResolution($maxResolution) {
            $this->_maxResolution = $maxResolution;
        }
        public function setOptions($options) {
            if (array_key_exists("location", $options))      $this->setLocation($options["location"]);
            if (array_key_exists("sizeLimit", $options))     $this->setSizeLimit($options["sizeLimit"]);
            if (array_key_exists("maxResolution", $options)) $this->setMaxResolution($options["maxResolution"]);
        }
        public function getLocation() {
            return $this->_location;
        }
        public function upload($fileToUpload, $user, $fileName = null) {
            $targetDir     = $this->_location.DIRECTORY_SEPARATOR;
            $imageFileType = strtolower(pathinfo($fileToUpload["name"],PATHINFO_EXTENSION));
            if ($imageFileType == "jpeg") $imageFileType = "jpg";
            $id = $this->_createDbEntry($user, $fileName);
            if (is_null($fileName)) {
                $fileName = $id.".".$imageFileType;
            }
            $targetFile    = (string)(\aae\fs\Path::resolve($targetDir . $fileName));
            if (is_null($fileToUpload))                    throw new \Exception("No image uploaded.",    1206141823);
            if(!@getimagesize($fileToUpload["tmp_name"]))   throw new \Exception("File is not an image.", 1206141824);
            if ($fileToUpload["size"] > $this->_sizeLimit) throw new \Exception("File is too large.",    1206141825);
            $this->_changeResolution($fileToUpload);
            if ($imageFileType != "jpg"  &&
                $imageFileType != "jpeg")                   throw new \Exception("Only JPG, JPEG files are allowed. You submitted a file of type $imageFileType.", 120614187);
            if (!move_uploaded_file($fileToUpload["tmp_name"], $targetFile)) throw new \Exception("There was an error uploading file '$targetFile'", 1206141828);
            $this->_lastUploadId = $id;
            return $fileName;
        }
        public function getLastUploadId() {
            return $this->_lastUploadId;
        }
        public function updateNameDescription($fileName, $imageName, $imageDescription) {
            return $this->_storageAPI->updateImageByFileName($fileName, $imageName, $imageDescription);
        }
        public function getImageByFileName($fileName) {
            $this->_storageAPI->setFetchMode(FAPI::FETCH_ASS_ARRAY | FAPI::FETCH_ONE_ROW);
            $result = $this->_storageAPI->getImageByFileName($fileName);
            $this->_storageAPI->setFetchMode(FAPI::RESET);
            return $result;
        }
        // TODO: temporary, only takes jpg files
        public function delete($user, $imageId) {
            $result = (int)$this->_storageAPI->deleteImage($user, $imageId);
            if ($result > 0) {
                $dir = (string)(\aae\fs\Path::resolve($this->_location.DIRECTORY_SEPARATOR.$imageId.".jpg"));
                if (unlink($dir)) return true;
            } else throw new \Exception("Image could not be deleted", 319152154);
        }
        public function _createDbEntry($user, $fileName = null) {
            if (is_null($fileName)) $fileName = "";
            return $this->_storageAPI->createImage($user, $fileName);
        }
        public function getFullPath($fileName = null) {
            // str_replace(array("/", "\\", DIRECTORY_SEPARATOR), '', $fileName)[0]; // make sure that relative directories can not be accessed
            $completeFileName = (string)(\aae\fs\Path::resolve($this->_location.DIRECTORY_SEPARATOR.$fileName));
            if (!is_file($completeFileName)) throw new \Exception("Image '$fileName' does not exist", 1205142029);
            return $completeFileName;
        }
        private function _changeResolution($fileToUpload) {
            if ($this->_maxResolution > 0) {
                $fileName   = $fileToUpload["tmp_name"];
                $imateResizer = new \aae\app\ImageResizer();
                $imateResizer->resize($fileName, $fileName, $this->_maxResolution);
            }
        }
    }
}