Третьего дня столкнулись с любопытной ошибкой на DataLife Engine.

DLE после заражения вирусами и последующего лечения (очень аккуратного, кстати) начала вместо страниц сайта отдавать ошибку.

Not Supported File! Thumbnails can only be made from .jpg, gif and .png images!

Поиск по тематическим форумам показал два факта:

  • примерно 20-30% обитателей таковых форумов или дети, или идиоты (сложно сказать — кого больше и чем они различаются), потому как ответы в половине случаев просто нагуглены и (если гуглили по буржуйским сайтам) бездарно переведены гугл-переводчиком.
  • все почти в один голос кричат «это всё хостинг виноват! У него модуль GD  не работает!»

«Ага!» — сказали мы, — «А может хостер и вправду, гад такой, сломал себе GD и не чинит? Надо проверить…» Для проверки работоспособности модуля gd был написан коротенький тестовый скрипт, который после закачки в корневую папку сайта и запуска наглядно показал — gd работает как часы.

После некоторых поисков выяснилось, что данная ошибка отдаётся файлом

/engine/classes/thumb.class.php

Который, как подсказывает нам Капитан Очевидность, отвечает за генерацию tumbnails (миниатюр изображений).

Дальнейшие разбирательства уже внутри указанного файла показали что проблема заключается в функции function thumbnail($imgfile), в теле которой перед началом обработки не выполнялась проверка на предмет того — существует ли (доступен ли) файл с которым эта функция собирается работать. В результате, если файл недоступен вся функция начинает сбоить, и предкоматозном состоянии выдаёт первую попавшуюся ошибку! В нашем случае — Not Supported File! Thumbnails can only be made from .jpg, gif and .png images!

Для лечения данного недостатка был использован следующий «костыль»:

if (!file_exists ($imgfile))
   {
   $imgfile=("/home/username/mysite.com/www/uploads/boxsmall.jpg"); 
// НЕ ЗАБЫВАЕМ!! вместо /home/username/mysite.com/www 
//подставить правильный путь к корневой папке сайта!!!
   }

Данный код проверяет, существует ли передаваемый ф-ции файл. Если нет, то принудительно заменяет его на файл-заглушку. В нашем случае файл с названием boxsmall.jpg , который находится в папке uploads нашего сайта.

Вставлять этот код необходимо сразу после объявления функции function thumbnail($imgfile), а точнее, после строк

function thumbnail($imgfile) {
	//detect image format

А всё вместе это будет выглядеть вот так:

	function thumbnail($imgfile) {
		//detect image format

	if (!file_exists ($imgfile))
	  {
	  $imgfile=("/home/username/mysite.com/www/uploads/boxsmall.jpg");
	  }	

		$info = @getimagesize($imgfile); 

		if( $info[2] == 2 ) {
			$this->img['format'] = "JPEG";
			$this->img['src'] = @imagecreatefromjpeg( $imgfile );
		} elseif( $info[2] == 3 ) {
			$this->img['format'] = "PNG";
			$this->img['src'] = @imagecreatefrompng( $imgfile );
		} elseif( $info[2] == 1 ) {
			$this->img['format'] = "GIF";
			$this->img['src'] = @imagecreatefromgif( $imgfile );
		} else {
			echo "Not Supported File! Thumbnails can only be made from .jpg, gif and .png images!";
			@unlink( $imgfile );
			exit();
		}

		if( !$this->img['src'] ) {
			echo "Not Supported File! Thumbnails can only be made from .jpg, gif and .png images!";
			@unlink( $imgfile );
			exit();

		}

		$this->img['lebar'] = @imagesx( $this->img['src'] );
		$this->img['tinggi'] = @imagesy( $this->img['src'] );
		$this->img['lebar_thumb'] = $this->img['lebar'];
		$this->img['tinggi_thumb'] = $this->img['tinggi'];
		//default quality jpeg
		$this->img['quality'] = 90;

	}

!!!НЕ ЗАБЫВАЕМ!!! вместо /home/username/mysite.com/www подставить правильный путь к корневой папке сайта!!! (можно узнать в техподдержке Вашего хостера)

Всё, теперь такой ошибки в случае недоступности или отсутствия картинок выдаваться не будет 100%!

Кстати, теперь вместо отсутствующих картинок будет отображаться вот такая заглушка:

 

и проблемные файлы станет вычислить значительно проще!