Здравствуйте. Загружаю на сайт с помощью AJAX изображение, с помощью этого класса изменяю рзмер изображения (делаю облегченный вариант) и сохраняю копию (т.е. сохраняю в общем 2 изображения). У себя сначала с большими изображениями не работало. Изменил в файле php.ini значения "upload_max_filesize" и "post_max_size", и всё работало нормально. После AJAX-загрузки изображения оба они оказывались в нужной папке. Но после того, как перевел файлы на сервер, с малым объёмом изображений (пробовал до 1,5МБ) всё прекрасно работает, а с большими изображениями (пробовал от 6,30МБ до 8,40МБ) скрипт AJAX не прекращает свою работу. То есть, в "beforeSend" я сделал эффект загрузки (затемнение экрана и гиф-картинка). И вот этот фон стоит бесконечно, даже ошибки не появляются. НО: в папке назначения для изображений оригинал появляется. То есть, как я понимаю, не работает класс изменения размера изображения. Хотя у меня в ПК всё работает. Код JS (AJAX): Код (Javascript): $("body").on("click", "#yaRasemOstauToima", function(){ var file_data = $('#rasemOst').prop('files')[0]; var form_data = new FormData(); form_data.append('yaRasem', file_data); $.ajax ({ url: "/ajaxImg.php", type: "POST", data: form_data, dataType: "text", cache: false, contentType: false, processData: false, beforeSend: function() { $("#floatKotu").fadeIn(); }, success: function(data) { $("#floatKotu").fadeOut(); alert(data); $("#floatRasOstau").remove(); } }); }); И код файла ajaxImg.php, который обрабатывает этот запрос: PHP: session_start(); require_once("config.php"); if(isset($_SESSION['MOHARRIR'])){ require_once("classSimpleImage.php"); $date= date("d")."-".date("m")."-".date("Y")."_"; if (isset($_FILES['yaRasem']['tmp_name'])) { if ($_FILES['yaRasem']['size'] > 1024 && $_FILES['yaRasem']['size'] < 10*1024*1024) { $rasIsem = basename($_FILES['yaRasem']['name']); $rasMiniIsem = str_replace('.jpg', '_mini.jpg', $rasIsem); move_uploaded_file($_FILES['yaRasem']['tmp_name'], "images/yanalyklar/".$date.$rasIsem); $image = new SimpleImage(); $image->load("images/yanalyklar/".$date.$rasIsem); $image->resizeToHeight(200); $image->save("images/yanalyklar/".$date.$rasMiniIsem); echo "<img class='rasemUrta' src='images/yanalyklar/".$date.$rasMiniIsem."' height='200' alt='' title=''>"; }else{ echo "Допустимый размер изображения от 1Кб до 10Мб."; } } }else{ exit(); } И код класса SimpleImage (файл classSimpleImage.php, который подключается выше): Код (Text): class SimpleImage { var $image; var $image_type; function load($filename) { $image_info = getimagesize($filename); $this->image_type = $image_info[2]; if( $this->image_type == IMAGETYPE_JPEG ) { $this->image = imagecreatefromjpeg($filename); } elseif( $this->image_type == IMAGETYPE_GIF ) { $this->image = imagecreatefromgif($filename); } elseif( $this->image_type == IMAGETYPE_PNG ) { $this->image = imagecreatefrompng($filename); } } function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image,$filename,$compression); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image,$filename); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image,$filename); } if( $permissions != null) { chmod($filename,$permissions); } } function output($image_type=IMAGETYPE_JPEG) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image); } } function getWidth() { return imagesx($this->image); } function getHeight() { return imagesy($this->image); } function resizeToHeight($height) { $ratio = $height / $this->getHeight(); $width = $this->getWidth() * $ratio; $this->resize($width,$height); } function resizeToWidth($width) { $ratio = $width / $this->getWidth(); $height = $this->getheight() * $ratio; $this->resize($width,$height); } function scale($scale) { $width = $this->getWidth() * $scale/100; $height = $this->getheight() * $scale/100; $this->resize($width,$height); } function resize($width,$height) { $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); $this->image = $new_image; } }
$this->image_type == IMAGETYPE_GIF Не используйте getimagesize() для проверки того, что файл является файлом с изображением. Для этих целей используйте расширение Fileinfo. --- Добавлено --- https://php.net/manual/ru/function.error-reporting.php
@MouseZver, На счет getimagesize() ничего сказать не могу, так как этот класс я скачал отдельно и ничего в нем не изменял. Ну вот с error_reporting никак не могу разобраться: как с ним иметь дело? Написал в начало страницы "error_reporting(E_ALL);" - ничего не выводится. Если данные записываются в какой-то файл, то где он находится?
Мои эксперименты показали, что если закомментировать в файле php (обработчик AJAX) эти строчки: PHP: $image = new SimpleImage(); $image->load("images/yanalyklar/".$date.$rasIsem); $image->resizeToHeight(200); $image->save("images/yanalyklar/".$date.$rasMiniIsem); , то код завершает свою работу (т.е. в файле скриптов в "success" приходит ответ). Получается, и вправду изменение размера изображения не выполняется. От этого возник ещё один фопрос: нельзя ли как-то "простенько", средствами php изменить размер изображения (задать высоту/ширину, а другая сторона изменилась в соотношении)? Пробовал сделать с помощью Imagick::adaptiveResizeImage, но почему-то ничего не получилось - не работало.
Так как ничего не получалось, я написал функцию изменения размера изображения сам, вручную - только то, что мне нужно. Но всё равно код ведет себя так же. Вот мой новый код: PHP: function resizeToHeight ($filename, $height, $outImg) { // $filename - входной файл; $height - высота, на которую нужно изменить; $outImg - выходной файл $img = imagecreatefromjpeg($filename); $origWidth = imagesx($img); $origHeight = imagesy($img); $ratio = $height / $origHeight; $width = $origWidth * $ratio; $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $img, 0, 0, 0, 0, $width, $height, $origWidth, $origHeight); $img = $new_image; imagejpeg($img, $outImg, 75); } // Запуск функции: resizeToHeight ("images/".$wakyt.$rasIsem, 200, "images/".$wakyt.$rasMiniIsem); И этот код ведет себя так же: у меня на ПК работает нормально, а на хосте - работает только с небольшими по размеру изображениями. У меня на Денвере PHP 5, а на хосте - 7-й версии. Не зависит ли от этого? Может, какие-то функции imagecreatefromjpeg(), imagesx(), imagecreatetruecolor(), imagecopyresampled(), imagejpeg() в новом PHP устарели и заменены на другую?
@gruth, Спасибо за код! А то многие пишут о error_reporting, а что с ним делать не говорят, вставляю в код - без результата. А тут всё показало. Вот ошибка: Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 24576 bytes) in /home/МойСайт/ajaxImg.php on line 9 В 9-й строке у меня это: PHP: $img = imagecreatefromjpeg($filename); (2-я строка кода, которую я написал выше).
error_reporting() устанавливает какие ошибки тебе нужно логировать --- Добавлено --- Тебе нужно в htaccess закинуть настройки для больших файлов(upload_max_filesize/post_max_size) либо в начале скрипта так же, через ини_сет задать их
Пробовал писать так в файле ajaxImg.php: PHP: ini_set("upload_max_filesize", "15M"); ini_set("post_max_size", "20M"); - вообще даже перестали ошибки показываться, как прежде. Даже запись "error_reporting(E_ALL);" не помогла. Написал в файле .htaccess так: Код (Text): php_value post_max_size 40M php_value upload_max_filesize 30M так при загрузке выходит такая же ошибка.
@mkramer, да, я-то перевел. Как я понял, это в хосте выделяется оперативная память для обработки данных, и её не хватает для обработки (изменения размера) изображения. Это так? Если так, то это нельзя исправить без контакта с хостером?
Да, не хватает именно оперативной памяти, выделяемой для работы скрипта php. От хостера и тарифа зависит, так что не знаю.
Друзья, всем спасибо! Связался с хостером, сказали написать в файле .htaccess следующую строку: Код (Text): php_value memory_limit 256M Написал - и всё отлично заработало.
Можно без .htaccess. Вот кусок "тяжелого" скрипта, который запускается кроном раз в сутки: PHP: ini_set('display_errors', "On"); error_reporting(E_ERROR | E_WARNING | E_PARSE); set_time_limit(0); ini_set('memory_limit', '-1');
@acso, да это я прочитал конечно. Но не понял суть. Так там же в значении должно стоять значение большее, как я знаю. тем более для тяжёлого скрипта. Если по умолчанию 30 секунд и этого не хватает - 40, 50 секунд? Вот поэтому и не могу понять, для чего нужна эта строка.
Видно плохо читали. Список параметров seconds Максимальное время выполнения в секундах. Если задан ноль, время выполнения неограничено.