За чистый и ясный код!

Статьи на тему программирования под веб, используя PHP, MySQL, Jquery и многое другое

Проверка существования файла-картинки перед выводом на экран в Kohana3

Январь19
Циркон удобрение лучше, что есть для почвы!

Все наверное сталкивались с проблемой, когда на сервере отсутствует картинки и вместо неё зияет дыра, особенно это видно в глючном семействе браузеров ИЕ. Как бы избежать этого, ну чтобы или вообще эта картинка не показывалась?

Во многих фреймверках имеются инструменты для работы с частыми HTML тегами, например для работы с тегом IMG во фреймворке Kohana имеется статический метод image, который располагается в классе HTML. Я рекомендую именно писать ссылки, картинки, элементы форм используя инструменты фреймверка, в чем выигрыш? Да в том, что можно управлять создаваемым тегом.

Вот реальный пример, когда мы в Kohana пишет тег image:

Html::image('/img/news/test.jpg', array('alt'=>'Testing'));

то при выводе на экран эта строка превратится в тег:

<img src="http://site.com/img/news/test.jpg" alt="Testing" />

Если картинка на серваке отсутствует, то в зависимости от браузера она либо на экран не покажется, либо просто зиять её дыра, но по-любому будет лишний запрос-заголовок к серверу для выдачи фотки.

http://nagaychenko.com/test.jpg

GET /test.jpg HTTP/1.1
Host: nagaychenko.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,uk;q=0.8,en-us;q=0.6,en;q=0.4,de;q=0.2
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: MANTIS_VIEW_ALL_COOKIE=4; MANTIS_PROJECT_COOKIE=1; 
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.x 200 OK
Date: Thu, 21 Jan 2010 09:09:33 GMT
Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.2.11
Last-Modified: Thu, 21 Jan 2010 09:08:49 GMT
Etag: "3b90001-1a31b-47da90d10ea40"
Accept-Ranges: bytes
Content-Length: 107291
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: image/jpeg

Чтобы этого избежать я перекрыл метов image и теперь я просто делаю проверку на файл, если файла реально нет, то и ничего не вывожу, никаких лишних запросов на сервер не делаю.

	/**
	 * Creates a image link.
	 *
	 * @param   string   file name
	 * @param   array    default attributes
	 * @return  string
	 */
	public static function image($file, array $attributes = NULL, $index = FALSE)
	{
	    $file_from_another_server = FALSE;
	    
		if (strpos($file, '://') === FALSE)
		{
		    
		    $file_exists = (is_file($_SERVER['DOCUMENT_ROOT'].$file) AND file_exists($_SERVER['DOCUMENT_ROOT'].$file)) ? TRUE : FALSE;
			// Add the base URL
			$file = URL::base($index).trim($file,'/');
		}
		else
		{
		    $file_from_another_server = TRUE;
		}

		// Add the image link
		$attributes['src'] = $file;

		// провряем есть ли файл на ФС
		if ($file_exists)
		{
		    return '<img'.HTML::attributes($attributes).' />';
		}
		elseif($file_from_another_server)
		{
		    return '<img'.HTML::attributes($attributes).' />';
		}
	}

В коде я проверяю на присутствие именно файла, т.к. php-функция file_exists проверяет существование директории, т.е. написали вы просто путь и получите положительный ответ, но этоже не файл! Поэтому я еще и проверяю файл ли я передаю ф-циец is_file.

Если передаешь ссылку с другого сайта, то тут я ничего проверить не могу, в таком случае я просто отдаюсь на сознательность другого сервера.

Проверил сам и использую на своем проекте.

В помощь тебе, юзер.

Статья просмотренна 83999 раз, зашло посетителей 26291

рубрика: Kohana

3 комментария в “Проверка существования файла-картинки перед выводом на экран в Kohana3”

  1. Avatar
    Юрий пишет:

    Но такая проверка замедляет генерацию ответа сервера. Так как проверка существования файла — это файловая операция, а они как известно медленные. Или я не правильно понимаю процесс?


  2. Avatar
    maxnag пишет:

    Да, вы совершенно правы, но можно немного развить тему и включить данный метод только для профилактики, дабы найти где отсутствуют картинки, потом что-то сделать. На продакшене с большим наплывом посетителей так делать не стоит.


  3. Avatar
    Юрий пишет:

    Да если так то мне это кажется целесообразным.


не публикуется

пример

Оставить комментарий или два:

  

Облако тегов

cli csv dump events form Kohana locale models MySQL mysqldump orm PHP tools trigger validate газ газовый счетчик итоги кеширование переменные

Облако тегов плагина WP Cumulus для WordPress требует для просмотра Flash Player 9 или выше.

Я на твиттере!

  • у твиттера тоже бывают перерывы...

Календарь

Январь 2010
Пн Вт Ср Чт Пт Сб Вс
« Дек   Фев »
 123
45678910
11121314151617
18192021222324
25262728293031

Сейчас на сайте