*/ class Uploader { private $width = ['min' => 0, 'max' => 0]; private $height = ['min' => 0, 'max' => 0]; private $maxFileSizeMb; private $savePath; private $extensions = 'jpg|png|jpeg|gif'; private $extMatches = []; private $FILE; private $cnm = null; public static $error; public function __construct($name, $cnm = null) { $this->FILE = $_FILES; if (!$this->FILE[$name]) { return; } $this->cnm = $cnm; } /** * @param int $max * @param int $min * @return void */ public function setWidth($max, $min = null) { $this->width['min'] = is_null($min) ? $max : $min; $this->width['max'] = $max; } /** * @param int $max * @param int $min * @return void */ public function setHeight($max, $min = null) { $this->height['min'] = is_null($min) ? $max : $min; $this->height['max'] = $max; } /** * @param $megabytes * @return void */ public function setMaxFileSize($megabytes) { $this->maxFileSizeMb = $megabytes * (1024 * 1024); } /** * @param string $path путь от корня до конечной папки без открывающего слеша. * @return void */ public function setSavePath($path) { $this->savePath = __DIR__ . '/' . $path; } /** * @param string|array $ext * @return void */ public function setExtentions($ext) { if (is_array($ext)) { $arr = $ext; } else { $arr[] = $ext; } if (!$arr) { return; } $this->extensions = implode('|', $arr); } /** * @param int $width * @param int $height * @return void */ public function setDimensions($width, $height) { $this->setWidth($width); $this->setHeight($height); } private function hasNormalDimensions() { list($width, $height) = getimagesize($this->FILE['tmp_name']); if ( $width < $this->width['min'] || $width > $this->width['max'] || $height < $this->height['min'] || $height > $this->height['max'] ) { self::$error = "Требования к размеру [{$this->width['max']}x{$this->height['max']}] не соблюдены."; if ($this->width['min'] !== $this->width['max'] || $this->height['min'] !== $this->height['max']) { self::$error .= " Минимум [{$this->width['min']}x{$this->height['min']}]."; } self::$error .= " [{$width}x$height]"; return false; } return true; } private function hasNormalFileSize() { if (!$this->maxFileSizeMb) { $this->setMaxFileSize(2); } if ($this->FILE['size'] > $this->maxFileSizeMb || $this->FILE['size'] <=0) { self::$error = 'Неверный размер файла. Максимальный размер файла ' . $this->maxFileSizeMb . ' МБ'; return false; } return true; } private function hasNormalType() { if ( !preg_match('/\.(' . $this->extensions . ')$/i', $this->FILE['name'], $this->extMatches) || !preg_match('/image/i', $this->FILE['type']) ) { self::$error = 'Неверный тип файла. Допустимые типы : ' . $this->extensions; return false; } return true; } private function hasNormalFilePath() { if (!$this->savePath || !is_dir($this->savePath)) { self::$error = 'Ошибка загрузки: нет такой папки.'; return false; } return true; } private function upload() { $this->extMatches[1] = strtolower($this->extMatches[1]); $fn = uniqid('f_', true) . '.' . $this->extMatches[1]; $fn2 = uniqid('f_', true) . '.gif'; if ($this->cnm) { $fn = $this->cnm; $fn2 = $this->cnm; } if (!move_uploaded_file($this->FILE['tmp_name'], $this->savePath . $fn)) { self::$error = 'Ошибка загрузки файла'; return false; } return [$fn2, $fn, $this->savePath . $fn]; } function saveimg() { return $this->hasNormalFilePath() && $this->hasNormalDimensions() && $this->hasNormalFileSize() && $this->hasNormalType() ? $this->upload() : false; } }