This commit is contained in:
2023-07-31 20:06:51 +03:00
109 changed files with 15204 additions and 33584 deletions
+78 -55
View File
@@ -1,62 +1,39 @@
<?php
use Core\Db;
/**
* Единая функция для заливки файлов на сервер.
*
* @author Ivor Barhansky <me@lopar.space>
* @version 1
*/
class Uploader
{
public static string $error;
private array $width = ['min' => 0, 'max' => 0];
private array $height = ['min' => 0, 'max' => 0];
private int $maxFileSizeMb;
private string $savePath;
private string $extensions = 'jpg|png|jpeg|gif';
private array $extMatches = [];
private array $FILE;
private $cnm;
public static string $error;
private array $file;
private string $customName;
public function __construct($name, $cnm = null)
public function __construct($name)
{
if (!isset($_FILES[$name])) {
return;
}
$this->FILE = $_FILES[$name];
$this->cnm = $cnm;
$this->file = $_FILES[$name];
}
/**
* @param int $max
* @param int|null $min
* @return void
* @param string $customName
*/
public function setWidth(int $max, ?int $min = null)
public function setCustomName(string $customName): void
{
$this->width['min'] = is_null($min) ? $max : $min;
$this->width['max'] = $max;
}
/**
* @param int $max
* @param int|null $min
* @return void
*/
public function setHeight(int $max, ?int $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;
$this->customName = $customName;
}
/**
@@ -96,9 +73,48 @@ class Uploader
$this->setHeight($height);
}
/**
* @param int $max
* @param int|null $min
* @return void
*/
public function setWidth(int $max, ?int $min = null)
{
$this->width['min'] = is_null($min) ? $max : $min;
$this->width['max'] = $max;
}
/**
* @param int $max
* @param int|null $min
* @return void
*/
public function setHeight(int $max, ?int $min = null)
{
$this->height['min'] = is_null($min) ? $max : $min;
$this->height['max'] = $max;
}
public function saveimg()
{
return $this->hasNormalFilePath() &&
$this->hasNormalDimensions() &&
$this->hasNormalFileSize() &&
$this->hasNormalType() ? $this->upload() : false;
}
private function hasNormalFilePath(): bool
{
if (!$this->savePath || !is_dir($this->savePath)) {
self::$error = 'Ошибка загрузки: нет такой папки.';
return false;
}
return true;
}
private function hasNormalDimensions(): bool
{
[$width, $height] = getimagesize($this->FILE['tmp_name']);
[$width, $height] = getimagesize($this->file['tmp_name']);
if (!$width || !$height) {
self::$error = 'Не подтянулись размеры файла.';
return false;
@@ -123,18 +139,27 @@ class Uploader
if (!$this->maxFileSizeMb) {
$this->setMaxFileSize(2);
}
if ($this->FILE['size'] > $this->maxFileSizeMb * (1024 * 1024) || $this->FILE['size'] <= 0) {
if ($this->file['size'] > $this->maxFileSizeMb * (1024 * 1024) || $this->file['size'] <= 0) {
self::$error = 'Неверный размер файла. Максимальный размер файла ' . $this->maxFileSizeMb . ' МБ';
return false;
}
return true;
}
/**
* @param $megabytes
* @return void
*/
public function setMaxFileSize($megabytes)
{
$this->maxFileSizeMb = $megabytes;
}
private function hasNormalType(): bool
{
if (
!preg_match('/\.(' . $this->extensions . ')$/i', $this->FILE['name'], $this->extMatches) ||
!preg_match('/image/i', $this->FILE['type'])
!preg_match('/\.(' . $this->extensions . ')$/i', $this->file['name'], $this->extMatches) ||
!preg_match('/image/i', $this->file['type'])
) {
self::$error = 'Неверный тип файла. Допустимые типы : ' . $this->extensions;
return false;
@@ -142,36 +167,34 @@ class Uploader
return true;
}
private function hasNormalFilePath(): bool
{
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 ($this->customName) {
$fn = $this->customName . '.' . pathinfo($this->file['name'], PATHINFO_EXTENSION);
$fn2 = $this->customName;
}
if (!move_uploaded_file($this->FILE['tmp_name'], $this->savePath . $fn)) {
if (!move_uploaded_file($this->file['tmp_name'], $this->savePath . $fn)) {
self::$error = 'Ошибка загрузки файла';
return false;
}
var_dump([$fn2, $fn, $this->savePath . $fn]);
return [$fn2, $fn, $this->savePath . $fn];
}
public function saveimg()
public function saveToDb()
{
return $this->hasNormalFilePath() &&
$this->hasNormalDimensions() &&
return $this->hasNormalDimensions() &&
$this->hasNormalFileSize() &&
$this->hasNormalType() ? $this->upload() : false;
$this->hasNormalType() ? $this->uploadToDatabase() : false;
}
}
private function uploadToDatabase(): int
{
$id = time();
Db::sql('insert into images (mime_type, img, id) VALUES (?,?,?)', [$this->file['type'], file_get_contents($this->file['tmp_name']), $id]);
return $id;
}
}