Если картинки нет, то выводить другую

Дмитрий Корнев
16 августа 2015

Задача легко решается с помощью PHP. Делаем проверку наличия файла картинки на диске. Если его не оказывалось, то меняем путь на другую картинку — заглушку. Этот способ работает, но есть более простое решение.

Старый способ, используя PHP:

// Путь картинки.
$img = 'datas/img/foto123.jpg';

// Если картинки нет или её размер подозрительно маленький.
if (!file_exists($img) || filesize($img) < 512) {
    // Перезаписываем переменную, путь картинки — заглушки.
   $img = 'datas/img/none.png';
}

Минус этого способа в том, что он дёргает лишний раз диск. Для большого и посещаемого сайта с кучей картинок — это критично.

Другой способ использует для этой же цели возможности HTML:

<img src="datas/img/foto123.jpg" onError="this.src='datas/img/none.png'">

В итоге получаем аналогичный результат. Работает быстро. Никакой видимой заминки, если картинка не найдена. Событие onError поддерживают все современные веб-браузеры. Есть какие-то проблемы лишь в IE8. Поищите информацию сами, если для вас это актуально.

Для справки, оба противоположных по смыслу события:

Вариант скрытия изображения:

<img src="datas/img/foto456.jpg" onError="this.style.display='none'">

Чтобы максимально разгрузить диск существует ещё способ решения с использованием Nginx.

7 комментариев

st
Спасибо огромное, очень помогло, но есть такой вопрос, я не программист и не веб-дизайнер, просто пилю интернет-магазин для себя на wordpress, с изображениями товаров всё работает, а с картинкой рубрики не могу разобраться, у меня берется ссылка из описания рубрики, код выглядит так ... Как в этом случае мне сделать, чтобы отображалась картинка при отсутствии или недоступности изображения из описания? Спасибо заранее.
Не знаю, надо разбираться, необходимо взглянуть на код в нормальном виде. Ваш код вставился некорректно (вырезал). Комментарии для этого не очень подходят.
Ал
5 Баллов! Вопрос привёл меня сразу к вам на сайт! 3 минуты, и всё работает! Спасибо!!!
Ва
Супер. Просто и полезно, спасибо!
Ал
А как сделать это же для большого количества картинок? Чтобы вместо всех отсутствующих фотографий выводилась "картинка-заглушка"?
Зависит от того, каким образом выводятся картинки и от возможностей движка. Если картинки, допустим, прикреплены к посту и выводятся скриптом, используя шаблон, то добавить этот код в шаблон.
Ле
С отложенной загрузкой не работает(