cleanObsoleteArchiveFiles($this->probability);// if ($fileAddress !== false) { $this->openFromFile($fileAddress); } return $this; } public function __destruct() {//Метод срабатывает при уничтожении объекта класса $this->res = false; return true; } public function openFromFile($fileAddress=false) {//Открывает файл изображения по указанному в входном параметре адресу, при успешном вызове создаётся ресурс библиотеки gd $this->reset(); if (is_file($fileAddress)) { $this->type = false; if ($this->res = imagecreatefromjpeg($fileAddress)) { $this->type = "jpg"; } elseif ($this->res = imagecreatefromwebp($fileAddress)) { $this->type = "webp"; // В PHP 7.4 почему то функция imagecreatefrombmp может вызывать ошибку, поэтому она закомментирована // } elseif ($this->res = imagecreatefrombmp($fileAddress) { // $this->type = "bmp"; } elseif ($this->res = imagecreatefrompng($fileAddress)) { $this->type = "png"; } if ($this->type !== false) { $this->loadedAddressFile = $fileAddress; $this->widthNow = imagesx($this->res); $this->heightNow = imagesy($this->res); } return $this->res; } } public function reset() {//Служебный метод - сброс до значений по умолчанию свойств объекта if ($this->checkLoad()) { imagedestroy($this->res); } $this->res = false; $this->type = false; $this->rndName = false; $this->widthNow = false; $this->heightNow = false; $this->createdDir = false; $this->loadedAddressFile = false; return true; } public function checkLoad() {//Проверет успешность загрузки изображения, то есть успешность создания по его адресу ресурса библиотеки gd if (($this->res !== false) and is_resource($this->res) and (get_resource_type($this->res) == "gd")) { return true; } return false; } public function resize($maxWidth=false,$maxHeight=false) {//Пережимает загруженное изображение до размеров не более чем указаны в входных параметрах, изображение остаётся в виде ресурса библиотеки gd if ($this->res and $this->type) { if ($maxWidth === false) {$maxWidth = $this->maxWidth;} if ($maxHeight === false) {$maxHeight = $this->maxHeight;} $coefficient = $maxWidth / $maxHeight; $calcWidth = $this->widthNow; $calcHeight = $this->heightNow; if (($this->widthNow != $maxWidth) or ($this->heightNow != $maxHeight)) { $calcWidth = $maxWidth; $calcHeight = round($maxHeight * $coefficient); if ($calcHeight > $maxHeight) { $calcHeight = $maxHeight; $coefficient = $maxHeight / $this->heightNow; $calcWidth = round($this->widthNow * $coefficient); } } $newRes=imagecreatetruecolor($calcWidth,$calcHeight); imagecopyresampled($newRes,$this->res,0,0,0,0,$calcWidth,$calcHeight,$this->widthNow,$this->heightNow); $this->res = $newRes; return true; } return false; } public function saveToJPG() {//Сохраняет пережатое загруженное изображение и исходный файл в архив(если включена соответствующая опция) if ($this->res) { if (isset($_REQUEST["item_id"]) and $_REQUEST["item_id"]) { $id = $_REQUEST["item_id"] * 1; $this->createdDir = false; $createdMainDir = false; $mainDirExists = true; $mainFolder = $this->DR() . $this->imageMainFolder . "/" . $id; if (!is_dir($mainFolder)) { $mainDirExists = false; $createdMainDir = @mkdir($mainFolder); } if ($mainDirExists or $createdMainDir) { // $this->rndName = $this->getAlphaNumericRandom($this->rndNameLen,true); $this->rndName = time() . $this->getAlphaNumericRandom($this->rndNameLen,true); $mainFileAddress = "$mainFolder/$id-" . $this->rndName . ".jpg"; if (@imagejpeg($this->res,$mainFileAddress)) { //[НАЧАЛО]Логика для загрузки файла без обработки в папку архива //Если убрать эту часть логики необходимо вывести в этой строчке return true; а перед ней возможно необходимо $this->createdDir = $createdMainDir; if ($this->archiveEnabled) { $createdArchiveDir = false; $archiveDirExists = true; $archiveFolder = $this->DR() . $this->imageArchiveFolder . "/" . $id; if (!is_dir($archiveFolder)) { $archiveDirExists = false; $createdArchiveDir = @mkdir($archiveFolder); } if ($archiveDirExists or $createdArchiveDir) { $archiveFileAddress = "$archiveFolder/$id-" . $this->rndName . ".jpg"; if (@copy($this->loadedAddressFile,$archiveFileAddress)) { $this->createdDir = $createdMainDir; return true; } else { if ($createdMainDir) {rmdir($mainFolder);} if ($createdArchiveDir) {rmdir($archiveFolder);} } } } else { $this->createdDir = $createdMainDir; return true; } //[КОНЕЦ]Логика для загрузки файла без обработки в папку архива } elseif ($createdMainDir) { rmdir($mainFolder); } } } } return false; } public function myint($var,$string = false) {//проверка на целое число, второй параметр указывает может ли переменная быть типа string if (is_numeric($var)) { if ($string) {$var = $var * 1;} if ($var === ((int) $var)) {return true;} }return false; } public function getAlphaNumericRandom($len=20,$down=false) {//получает случайную буквенно-цифровую последовательность указанной длины if ($this->myint($len,true) and ($len >= 1)) { $numeric = array("1","2","3","4","5","6","7","8","9","0"); $alpha = array("q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m"); if (!$down) {$alpha = array("Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M","q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m");} $alphaNumeric = array_merge($alpha,$numeric); $AalphaNumeric = count($alphaNumeric) - 1; $result = ""; for ($i=1;$i<=$len;$i++) { if ($i == 1) { $result .= $alpha[mt_rand(0,count($alpha)-1)]; } else { $result .= $alphaNumeric[mt_rand(0,$AalphaNumeric)]; } } return $result; } return false; } public static function DR() {//Служебный метод - получает DOCUMENT_ROOT в отличии от стандартного предусмотренного PHP всегда имеет слеш на конце if (self::$documentRoot === false) { self::$documentRoot = $_SERVER["DOCUMENT_ROOT"]; if (substr(self::$documentRoot,strlen(self::$documentRoot)-1,1) != "/") {self::$documentRoot .= "/";} } return self::$documentRoot; } public function getSRCById($id=false) {//Получает массив SRC пережатых файлов изображений по Id элемента к которому они относятся if ($id !== false) { $srcImages = array(); foreach (glob(self::DR() . $this->imageMainFolder . "/$id/$id-*.*") as $item) { if (($itemLen = strlen($item)) > ($DRLen = (strlen(self::DR()) - 1))) { $srcImages[] = substr($item,$DRLen); } } if (count($srcImages)) { return $srcImages; } } return false; } public function deleteByUri($uri=false,$id=false) {//Удаляет файл пережатого иображения по полному URi и Id элемента к которому относится фото if (($uri !== false) and ($id !== false)) { //Убрал проверку так как вторая проверка включает её (substr($uri,0,$imageMainFolderLen) == $this->imageMainFolder) if ((strlen($this->imageMainFolder) < strlen($uri)) and (($folderPlus = ($this->imageMainFolder."/$id/$id-")) == substr($uri,1,strlen($folderPlus))) and is_file(self::DR() . ($fileAddress = substr($uri,1,(strlen($uri)-1))))) { if (@unlink(self::DR() . $fileAddress)) { return true; } } } return false; } function getDirList($dir="") {//Рекурсивно получает дерево директорий, принимает адрес директории для сканирования в конец должен быть слеш $dirAr = array(); foreach (glob("$dir{,.}*",GLOB_BRACE) as $a) { if (is_dir($a) and (basename($a) != ".") and (basename($a) != "..")) { $dirAr[] = $a; foreach ($this->getDirList("$a/") as $b) { $dirAr[] = $b; } } } return $dirAr; } function getAllArchiveImages() {//Получает массив всех файлов из архива(для любой вложенности по папкам) $allDirsAr = $this->getDirList($this->DR() . $this->imageArchiveFolder); if (is_array($allDirsAr) and count($allDirsAr)) { $files = array(); foreach ($allDirsAr as $dir) { foreach (glob("$dir/{,.}*",GLOB_BRACE) as $file) { if (is_file($file)) { $files[] = $file; } } } return $files; } return false; } function cleanObsoleteArchiveFiles($probability = false) {//Удаляет устаревшие файлы архива, если включена опция automaticArchiveCleaning в настройках принимает вероятность срабатывания. Если вероятность передана как false или 0 то срабатывает каждый раз, если передать к примеру 5 то срабатывает с вероятностью 1 раз из 6 $result = true; if (($this->automaticArchiveCleaning) and (!myint($probability,true) or (myint($probability,true) and (mt_rand(0,$probability) == $probability)))) { $files = $this->getAllArchiveImages(); foreach ($files as $file) { $filetime = filemtime($file); if (($filetime + $this->archiveStorageTime) <= time()) { if (!@unlink($file)) { $result = false; } } } } return true; } } PHP и JavaScript код для отображения изображений на детальной странице в виде слайдера defaultSRC;//первое изображение или изображение по умолчанию $id = false;//id мусорной площадки $swipeButtonStyle = "style=\"display: none;\" ";//Стиль применится к кнопкам пролистывания если фотографий меньше двух $deleteButtonStyle = "style=\"display: none;\" ";//Стиль применится к кнопке удаления если есть хотя бы одна фотография $deleteButtonValue = "Удалить"; if (isset($_GET["id"]) and myint($_GET["id"],true)) { $id = $_GET["id"] * 1; if (is_array($images = $images->getSRCById($id)) and ($imagesArCount = count($images))) { $deleteButtonStyle = ""; if ($imagesArCount >= 2) {$swipeButtonStyle = "";$deleteButtonValue = "Удалить 1/$imagesArCount";} $defaultSRC = $images[0]; $first = true; $imagesSRCToJS = ""; foreach ($images as $src) { if (!$first) {$imagesSRCToJS .=",";} else {$first = false;} $imagesSRCToJS .= "'" . $src . "'"; } } } //[КОНЕЦ]Получаем информацию о изображениях по id мусорной площадки ?> Фото Изменить фото: /> /> /> Ajax скрипт в котором для изображений реализованы методы удаления и добавления deleteByUri($src,$id)) { $JSONResult->status = 1; } else { $JSONResult->errorMessage = "Изображения с тамим адресом у указанного элемена не существует."; } } else { $JSONResult->errorMessage = "Необходимо указать адрес удаляемого."; } $JSONResult->imagesAr = $img->getSRCById($id); $JSONResult->viewPhoto = $img->defaultSRC; if (is_array($JSONResult->imagesAr) and count($JSONResult->imagesAr)) {//Возможно проверка is_array избыточная $JSONResult->viewPhoto = $JSONResult->imagesAr[0]; } } else { $JSONResult->errorMessage = "Необходимо указать id элемента для удаляемого файла."; } } elseif ($_REQUEST["method"] == "add") { if (isset($_FILES['file']['tmp_name']) and is_file($_FILES['file']['tmp_name'])) { if (isset($_REQUEST["item_id"]) and myint($_REQUEST["item_id"],true)) { $id = $_REQUEST["item_id"] * 1; $img = new imageProcessor($_FILES['file']['tmp_name']); if ($img->resize()) { if ($img->saveToJPG() and $img->rndName) { $JSONResult->status = 1; $JSONResult->imagesAr = $img->getSRCById($id); $JSONResult->viewPhoto = $img->defaultSRC; if (is_array($JSONResult->imagesAr)) { foreach ($JSONResult->imagesAr as $itemSRC) { if (strpos($itemSRC,$img->rndName) !== false) { $JSONResult->viewPhoto = $itemSRC; break; } } } } else { $JSONResult->errorMessage = "Не удалось сохранить файл в предназначенную для этого дирректорию."; } } else { $JSONResult->errorMessage = "Для загрузки необходимо выбрать файл изображения."; } } else { $JSONResult->errorMessage = "Не указан id элемента дл которого осуществляется загрузка файла."; } } else { $JSONResult->errorMessage = "Не был передан файл изображения."; } } } echo json_encode($JSONResult);