game/_incl_data/class/Uploader.php

177 lines
4.6 KiB
PHP

<?php
/**
* Åäèíàÿ ôóíêöèÿ äëÿ çàëèâêè ôàéëîâ íà ñåðâåð.
*
* @author Ivor Barhansky <me@lopar.space>
* @version 1
*/
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;
public static $error;
public function __construct($name, $cnm = null)
{
if (!isset($_FILES[$name])) {
return;
}
$this->FILE = $_FILES[$name];
$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;
}
/**
* @param string $path ïóòü îò êîðíÿ äî êîíå÷íîé ïàïêè áåç îòêðûâàþùåãî ñëåøà.
* @return void
*/
public function setSavePath($path)
{
$this->savePath = $_SERVER['DOCUMENT_ROOT'] . '/' . $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 || !$height) {
self::$error = 'Íå ïîäòÿíóëèñü ðàçìåðû ôàéëà.';
return false;
}
if (
($width < $this->width['min'] || $width > $this->width['max']) ||
($height < $this->height['min'] || $height > $this->height['max'])
) {
self::$error = 'Òðåáîâàíèÿ ê ðàçìåðó: ';
if ($this->width['min'] !== $this->width['max'] || $this->height['min'] !== $this->height['max']) {
self::$error .= "îò [{$this->width['min']} x {$this->height['min']}] äî ";
}
self::$error .= "[{$this->width['max']} x {$this->height['max']}].";
self::$error .= " Òåêóùèé ðàçìåð [$width x $height]";
return false;
}
return true;
}
private function hasNormalFileSize()
{
if (!$this->maxFileSizeMb) {
$this->setMaxFileSize(2);
}
if ($this->FILE['size'] > $this->maxFileSizeMb * (1024 * 1024) || $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;
}
}