Сбой удаленного изменения размера изображения

#php #image #resize

#php #изображение #изменение размера

Вопрос:

У меня есть форма загрузки изображения на моей веб-странице и скрипты (указывающие на «handleImage.php «), чтобы я мог сохранить на своем сервере полную копию изображения и его большого пальца.

Я заметил, что это отлично работает для изображений размером не более 500 КБ, но для изображений большего размера я не могу создать уменьшенную версию, и скрипты застряли на пустой странице (handleImage.php ).

Мой сервер — Aruba.

Ниже приведены мои скрипты:

handleImage.php

 if(isset($_POST['id']))
{

 foreach($_FILES['pictures']['name'] as $number=>$file)
 {
  if($_FILES['pictures']['error'][$number]==UPLOAD_ERR_OK)
  {
    //i need to store full image and small in folder
    $ext=pathinfo($_FILES['pictures']['name'][$number],PATHINFO_EXTENSION);
    $folder="upload".time();

    mkdir('/web/htdocs/www.mysite.it/home/img/events/eventsdone/'.$folder);

$destinationFile="/web/htdocs/www.mysite.it/home/img/events/eventsdone/".$folder."/full.".$ext;    
    $pathPic="/web/htdocs/www.mysite.it/home/img/events/eventsdone/".$folder."/";
    $ret=@move_uploaded_file($_FILES['pictures']['tmp_name'][$number],$destinationFile);  


if($ret==FALSE)
{
  throw new UploadErrorException(); 
}

$pathThumb=$pathPic."thumb.".$ext;
$resizemgr = new ResizeManager($destinationFile);
$resizemgr -> resizeImage(200,130, 'crop');
$resizemgr -> saveImage($pathThumb, 100); 

    [...]

header("Location:event.php?id={$_POST['id']}");
    }


        }   
}
  

}

resizeManager.php

 Class ResizeManager
    {
        // *** Class variables
        private $image;
        private $width;
        private $height;
        private $imageResized;

        function __construct($fileName)
        {
            // *** Open up the file
            $this->image = $this->openImage($fileName);

            // *** Get width and height
            $this->width  = imagesx($this->image);
            $this->height = imagesy($this->image);
        }

        ## --------------------------------------------------------

        private function openImage($file)
        {
            // *** Get extension
            $extension = strtolower(strrchr($file, '.'));

            switch($extension)
            {
                case '.jpg':
                case '.jpeg':
                    $img = @imagecreatefromjpeg($file);
                    break;
                case '.gif':
                    $img = @imagecreatefromgif($file);
                    break;
                case '.png':
                    $img = @imagecreatefrompng($file);
                    break;
                default:
                    $img = false;
                    break;
            }
            return $img;
        }

        ## --------------------------------------------------------

        public function resizeImage($newWidth, $newHeight, $option="auto")
        {
            // *** Get optimal width and height - based on $option
            $optionArray = $this->getDimensions($newWidth, $newHeight, $option);

            $optimalWidth  = $optionArray['optimalWidth'];
            $optimalHeight = $optionArray['optimalHeight'];


            // *** Resample - create image canvas of x, y size
            $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
            imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);


            // *** if option is 'crop', then crop too
            if ($option == 'crop') {
                $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
            }
        }

        ## --------------------------------------------------------

        private function getDimensions($newWidth, $newHeight, $option)
        {

           switch ($option)
            {
                case 'exact':
                    $optimalWidth = $newWidth;
                    $optimalHeight= $newHeight;
                    break;
                case 'portrait':
                    $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                    $optimalHeight= $newHeight;
                    break;
                case 'landscape':
                    $optimalWidth = $newWidth;
                    $optimalHeight= $this->getSizeByFixedWidth($newWidth);
                    break;
                case 'auto':
                    $optionArray = $this->getSizeByAuto($newWidth, $newHeight);
                    $optimalWidth = $optionArray['optimalWidth'];
                    $optimalHeight = $optionArray['optimalHeight'];
                    break;
                case 'crop':
                    $optionArray = $this->getOptimalCrop($newWidth, $newHeight);
                    $optimalWidth = $optionArray['optimalWidth'];
                    $optimalHeight = $optionArray['optimalHeight'];
                    break;
            }
            return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
        }

        ## --------------------------------------------------------

        private function getSizeByFixedHeight($newHeight)
        {
            $ratio = $this->width / $this->height;
            $newWidth = $newHeight * $ratio;
            return $newWidth;
        }

        private function getSizeByFixedWidth($newWidth)
        {
            $ratio = $this->height / $this->width;
            $newHeight = $newWidth * $ratio;
            return $newHeight;
        }

        private function getSizeByAuto($newWidth, $newHeight)
        {
            if ($this->height < $this->width)
            // *** Image to be resized is wider (landscape)
            {
                $optimalWidth = $newWidth;
                $optimalHeight= $this->getSizeByFixedWidth($newWidth);
            }
            elseif ($this->height > $this->width)
            // *** Image to be resized is taller (portrait)
            {
                $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                $optimalHeight= $newHeight;
            }
            else
            // *** Image to be resizerd is a square
            {
                if ($newHeight < $newWidth) {
                    $optimalWidth = $newWidth;
                    $optimalHeight= $this->getSizeByFixedWidth($newWidth);
                } else if ($newHeight > $newWidth) {
                    $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                    $optimalHeight= $newHeight;
                } else {
                    // *** Sqaure being resized to a square
                    $optimalWidth = $newWidth;
                    $optimalHeight= $newHeight;
                }
            }

            return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
        }

        ## --------------------------------------------------------

        private function getOptimalCrop($newWidth, $newHeight)
        {

            $heightRatio = $this->height / $newHeight;
            $widthRatio  = $this->width /  $newWidth;

            if ($heightRatio < $widthRatio) {
                $optimalRatio = $heightRatio;
            } else {
                $optimalRatio = $widthRatio;
            }

            $optimalHeight = $this->height / $optimalRatio;
            $optimalWidth  = $this->width  / $optimalRatio;

            return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
        }

        ## --------------------------------------------------------

        private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
        {
            // *** Find center - this will be used for the crop
            $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
            $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );

            $crop = $this->imageResized;
            //imagedestroy($this->imageResized);

            // *** Now crop from center to exact requested size
            $this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
            imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
        }

        ## --------------------------------------------------------

        public function saveImage($savePath, $imageQuality="100")
        {
            // *** Get extension
            $extension = strrchr($savePath, '.');
            $extension = strtolower($extension);

            switch($extension)
            {
                case '.jpg':
                case '.jpeg':
                    if (imagetypes() amp; IMG_JPG) {
                        imagejpeg($this->imageResized, $savePath, $imageQuality);
                    }
                    break;

                case '.gif':
                    if (imagetypes() amp; IMG_GIF) {
                        imagegif($this->imageResized, $savePath);
                    }
                    break;

                case '.png':
                    // *** Scale quality from 0-100 to 0-9
                    $scaleQuality = round(($imageQuality/100) * 9);

                    // *** Invert quality setting as 0 is best, not 9
                    $invertScaleQuality = 9 - $scaleQuality;

                    if (imagetypes() amp; IMG_PNG) {
                         imagepng($this->imageResized, $savePath, $invertScaleQuality);
                    }
                    break;

                // ... etc

                default:
                    // *** No extension - No save.
                    break;
            }

            imagedestroy($this->imageResized);
        }


        ## --------------------------------------------------------

    }
  

В чем проблема??От какого параметра (возможно, php.ini settingd) может зависеть эта проблема?

ps отлично работает в локальной среде

Спасибо, Лука

Комментарии:

1. Возможно, время ожидания скрипта истекло?.. Попробуйте добавить «set_time_limit(60);» в handleimage.php

2. Проверьте настройки post_max_size и upload_max_filesize в вашем php.ini. Оба эти значения должны быть больше размера файла, который вы пытаетесь загрузить.

3. @Kristoffer la Cour не работает .. та же проблема .. пробел handleImage.php страница @Andras Szepeshazi upload_max_filesize = 25M и post_max_size = 30M .. файл, который я тестирую, составляет всего 900 КБ!

4. @Kristoffer la Cour даже если я добавил «set_time_limit (60)», пустая страница появляется через 20 секунд.. возможно, настройка по умолчанию не перезаписывается? в любом случае на сервере php.ini max_execution_time=120 ..=S

5. Ну, тогда это не проблема, моим следующим предположением будет память, как предлагает @Sabeen Malik.

Ответ №1:

Я бы рекомендовал вам заглянуть в файлы журналов. Похоже, это может быть связано с настройкой memory_limit в php.ini, просматривая файлы журнала, вы можете найти сообщения о неустранимых ошибках на этот счет (Неустранимая ошибка: не хватает памяти).

Комментарии:

1. Допустимый объем памяти 67108864 байт исчерпан (пытался выделить 39114612 байт) Он слишком большой, но я тестирую с размером jpg 900 Кб .. почему?

2. 39114612 байт = ~ 300 кб. Вы пробовали увеличить свой лимит памяти, скажем, для надежности, до 16 МБ?

3. @luca Ваш допустимый размер составляет 64 мб, я бы рекомендовал увеличить его до 128 мб, я полагаю, что в наши дни это значение по умолчанию.

4. @luca память относится к общей памяти, которая используется для управления изображением, чем больше изображение, тем больше памяти и процессора потребуется для выполнения графических операций над ним.