За последние 24 часа нас посетили 51973 программиста и 1763 робота. Сейчас ищут 870 программистов ...

Отправка и изменение размеров изображения

Тема в разделе "PHP для новичков", создана пользователем Булат Азат улы, 23 сен 2017.

  1. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    Здравствуйте. Загружаю на сайт с помощью AJAX изображение, с помощью этого класса изменяю рзмер изображения (делаю облегченный вариант) и сохраняю копию (т.е. сохраняю в общем 2 изображения).
    У себя сначала с большими изображениями не работало. Изменил в файле php.ini значения "upload_max_filesize" и "post_max_size", и всё работало нормально. После AJAX-загрузки изображения оба они оказывались в нужной папке.
    Но после того, как перевел файлы на сервер, с малым объёмом изображений (пробовал до 1,5МБ) всё прекрасно работает, а с большими изображениями (пробовал от 6,30МБ до 8,40МБ) скрипт AJAX не прекращает свою работу. То есть, в "beforeSend" я сделал эффект загрузки (затемнение экрана и гиф-картинка). И вот этот фон стоит бесконечно, даже ошибки не появляются. НО: в папке назначения для изображений оригинал появляется. То есть, как я понимаю, не работает класс изменения размера изображения. Хотя у меня в ПК всё работает.
    Код JS (AJAX):
    Код (Javascript):
    1. $("body").on("click", "#yaRasemOstauToima", function(){
    2.     var file_data = $('#rasemOst').prop('files')[0];
    3.     var form_data = new FormData();
    4.     form_data.append('yaRasem', file_data);
    5.     $.ajax ({
    6.         url: "/ajaxImg.php",
    7.         type: "POST",
    8.         data: form_data,
    9.         dataType: "text",
    10.         cache: false,
    11.         contentType: false,
    12.         processData: false,
    13.         beforeSend: function() {
    14.             $("#floatKotu").fadeIn();
    15.         },
    16.         success: function(data) {
    17.             $("#floatKotu").fadeOut();
    18.             alert(data);
    19.             $("#floatRasOstau").remove();
    20.         }
    21.     });
    22. });
    И код файла ajaxImg.php, который обрабатывает этот запрос:
    PHP:
    1. require_once("config.php");
    2. if(isset($_SESSION['MOHARRIR'])){
    3.     require_once("classSimpleImage.php");
    4.     $date= date("d")."-".date("m")."-".date("Y")."_";
    5.  
    6.     if (isset($_FILES['yaRasem']['tmp_name'])) {
    7.         if ($_FILES['yaRasem']['size'] > 1024 && $_FILES['yaRasem']['size'] < 10*1024*1024) {
    8.             $rasIsem = basename($_FILES['yaRasem']['name']);
    9.             $rasMiniIsem = str_replace('.jpg', '_mini.jpg', $rasIsem);
    10.             move_uploaded_file($_FILES['yaRasem']['tmp_name'], "images/yanalyklar/".$date.$rasIsem);
    11.          
    12.             $image = new SimpleImage();
    13.             $image->load("images/yanalyklar/".$date.$rasIsem);
    14.             $image->resizeToHeight(200);
    15.             $image->save("images/yanalyklar/".$date.$rasMiniIsem);
    16.          
    17.             echo "<img class='rasemUrta' src='images/yanalyklar/".$date.$rasMiniIsem."' height='200' alt='' title=''>";
    18.         }else{
    19.             echo "Допустимый размер изображения от 1Кб до 10Мб.";
    20.         }
    21.     }
    22.  
    23. }else{
    24.     exit();
    25. }
    И код класса SimpleImage (файл classSimpleImage.php, который подключается выше):
    Код (Text):
    1. class SimpleImage {
    2.  
    3.    var $image;
    4.    var $image_type;
    5.  
    6.    function load($filename) {
    7.       $image_info = getimagesize($filename);
    8.       $this->image_type = $image_info[2];
    9.       if( $this->image_type == IMAGETYPE_JPEG ) {
    10.          $this->image = imagecreatefromjpeg($filename);
    11.       } elseif( $this->image_type == IMAGETYPE_GIF ) {
    12.          $this->image = imagecreatefromgif($filename);
    13.       } elseif( $this->image_type == IMAGETYPE_PNG ) {
    14.          $this->image = imagecreatefrompng($filename);
    15.       }
    16.    }
    17.    function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
    18.       if( $image_type == IMAGETYPE_JPEG ) {
    19.          imagejpeg($this->image,$filename,$compression);
    20.       } elseif( $image_type == IMAGETYPE_GIF ) {
    21.          imagegif($this->image,$filename);
    22.       } elseif( $image_type == IMAGETYPE_PNG ) {
    23.          imagepng($this->image,$filename);
    24.       }
    25.       if( $permissions != null) {
    26.          chmod($filename,$permissions);
    27.       }
    28.    }
    29.    function output($image_type=IMAGETYPE_JPEG) {
    30.       if( $image_type == IMAGETYPE_JPEG ) {
    31.          imagejpeg($this->image);
    32.       } elseif( $image_type == IMAGETYPE_GIF ) {
    33.          imagegif($this->image);
    34.       } elseif( $image_type == IMAGETYPE_PNG ) {
    35.          imagepng($this->image);
    36.       }
    37.    }
    38.    function getWidth() {
    39.       return imagesx($this->image);
    40.    }
    41.    function getHeight() {
    42.       return imagesy($this->image);
    43.    }
    44.    function resizeToHeight($height) {
    45.       $ratio = $height / $this->getHeight();
    46.       $width = $this->getWidth() * $ratio;
    47.       $this->resize($width,$height);
    48.    }
    49.    function resizeToWidth($width) {
    50.       $ratio = $width / $this->getWidth();
    51.       $height = $this->getheight() * $ratio;
    52.       $this->resize($width,$height);
    53.    }
    54.    function scale($scale) {
    55.       $width = $this->getWidth() * $scale/100;
    56.       $height = $this->getheight() * $scale/100;
    57.       $this->resize($width,$height);
    58.    }
    59.    function resize($width,$height) {
    60.       $new_image = imagecreatetruecolor($width, $height);
    61.       imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
    62.       $this->image = $new_image;
    63.    }
    64. }
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    $this->image_type == IMAGETYPE_GIF
    Не используйте getimagesize() для проверки того, что файл является файлом с изображением. Для этих целей используйте расширение Fileinfo.
    --- Добавлено ---
    https://php.net/manual/ru/function.error-reporting.php
     
  3. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @MouseZver, На счет getimagesize() ничего сказать не могу, так как этот класс я скачал отдельно и ничего в нем не изменял.
    Ну вот с error_reporting никак не могу разобраться: как с ним иметь дело?
    Написал в начало страницы "error_reporting(E_ALL);" - ничего не выводится. Если данные записываются в какой-то файл, то где он находится?
     
  4. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    Мои эксперименты показали, что если закомментировать в файле php (обработчик AJAX) эти строчки:
    PHP:
    1. $image = new SimpleImage();
    2. $image->load("images/yanalyklar/".$date.$rasIsem);
    3. $image->resizeToHeight(200);
    4. $image->save("images/yanalyklar/".$date.$rasMiniIsem);
    , то код завершает свою работу (т.е. в файле скриптов в "success" приходит ответ). Получается, и вправду изменение размера изображения не выполняется.

    От этого возник ещё один фопрос: нельзя ли как-то "простенько", средствами php изменить размер изображения (задать высоту/ширину, а другая сторона изменилась в соотношении)? Пробовал сделать с помощью Imagick::adaptiveResizeImage, но почему-то ничего не получилось - не работало.
     
  5. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    Так как ничего не получалось, я написал функцию изменения размера изображения сам, вручную - только то, что мне нужно. Но всё равно код ведет себя так же. Вот мой новый код:
    PHP:
    1. function resizeToHeight ($filename, $height, $outImg) { // $filename - входной файл; $height - высота, на которую нужно изменить; $outImg - выходной файл
    2.     $img = imagecreatefromjpeg($filename);
    3.     $origWidth = imagesx($img);
    4.     $origHeight = imagesy($img);
    5.     $ratio = $height / $origHeight;
    6.     $width = $origWidth * $ratio;
    7.     $new_image = imagecreatetruecolor($width, $height);
    8.     imagecopyresampled($new_image, $img, 0, 0, 0, 0, $width, $height, $origWidth, $origHeight);
    9.     $img = $new_image;
    10.     imagejpeg($img, $outImg, 75);
    11. }
    12.  
    13. // Запуск функции:
    14. resizeToHeight ("images/".$wakyt.$rasIsem, 200, "images/".$wakyt.$rasMiniIsem);
    И этот код ведет себя так же: у меня на ПК работает нормально, а на хосте - работает только с небольшими по размеру изображениями.
    У меня на Денвере PHP 5, а на хосте - 7-й версии. Не зависит ли от этого? Может, какие-то функции imagecreatefromjpeg(), imagesx(), imagecreatetruecolor(), imagecopyresampled(), imagejpeg() в новом PHP устарели и заменены на другую?
     
  6. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    PHP:
    1. <?php
    2. // включаем показ ошибок
    3. ini_set("display_errors", 1);
     
  7. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @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:
    1. $img = imagecreatefromjpeg($filename);
    (2-я строка кода, которую я написал выше).
     
  8. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    error_reporting() устанавливает какие ошибки тебе нужно логировать
    --- Добавлено ---
    Тебе нужно в htaccess закинуть настройки для больших файлов(upload_max_filesize/post_max_size) либо в начале скрипта так же, через ини_сет задать их
     
  9. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    Пробовал писать так в файле ajaxImg.php:
    PHP:
    1. ini_set("upload_max_filesize", "15M");
    2. ini_set("post_max_size", "20M");
    - вообще даже перестали ошибки показываться, как прежде. Даже запись "error_reporting(E_ALL);" не помогла.

    Написал в файле .htaccess так:
    Код (Text):
    1. php_value post_max_size 40M
    2. php_value upload_max_filesize 30M
    так при загрузке выходит такая же ошибка.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ты перевёл ошибку?
    --- Добавлено ---
    Она же не про upload_max_filesize и не про post_max_size
     
  11. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @mkramer, да, я-то перевел. Как я понял, это в хосте выделяется оперативная память для обработки данных, и её не хватает для обработки (изменения размера) изображения. Это так? Если так, то это нельзя исправить без контакта с хостером?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Да, не хватает именно оперативной памяти, выделяемой для работы скрипта php. От хостера и тарифа зависит, так что не знаю.
     
  13. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    Друзья, всем спасибо! Связался с хостером, сказали написать в файле .htaccess следующую строку:
    Код (Text):
    1. php_value memory_limit 256M
    Написал - и всё отлично заработало.
     
  14. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Можно без .htaccess. Вот кусок "тяжелого" скрипта, который запускается кроном раз в сутки:
    PHP:
    1.   ini_set('display_errors', "On");
    2.   error_reporting(E_ERROR | E_WARNING | E_PARSE);
    3.   ini_set('memory_limit', '-1');
     
  15. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
  16. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Ну так щелкните по ней маусом)
     
  17. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @acso, да это я прочитал конечно. Но не понял суть. Так там же в значении должно стоять значение большее, как я знаю. тем более для тяжёлого скрипта. Если по умолчанию 30 секунд и этого не хватает - 40, 50 секунд?
    Вот поэтому и не могу понять, для чего нужна эта строка.
     
  18. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Видно плохо читали.
    Список параметров
    seconds Максимальное время выполнения в секундах. Если задан ноль, время выполнения неограничено.
     
  19. Булат Азат улы

    Булат Азат улы Активный пользователь

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @acso, понял, спасибо!