перенаправление браузера на новое изображение с типом содержимого image / png в PHP - PullRequest
0 голосов
/ 17 января 2010

У меня есть скрипт php, который генерирует изображение и используется (в основном) так:

<img src="user_image.php?id=[some_guid]" />

Скрипт использует класс, который я написал, для отображения изображения, соответствующего этому идентификатору. Хотя есть ряд вещей, которые могут пойти не так, и каждая из них создает исключение. Итак, у меня есть что-то вроде этого:

<?php

try {

    if( ! isset($_GET['id']) ) throw new Exception;

    $images = new User_Images;
    $images->display($_GET['id']);

} catch( Exception $e ) {

    header('location: images/link_error.png');

}

Если я смотрю это из браузера, все в порядке - если произошла ошибка, адрес в адресной строке изменится на images/link_error.png и отобразит это вместо этого.

Но когда этот скрипт используется в теге <img>, и при захвате изображения возникает ошибка, он вообще не отображается.

Переадресация заголовка не работает таким образом? Как еще я могу это сделать?

обновление

Нет проблем, перенаправления браузера работают так, проблема заключалась в том, что мой браузер кэшировал пустое изображение, которое было возвращено до того, как было произведено перенаправление. Жесткое обновление ( Ctrl + F5 для Firefox) исправил это и начал работать как обычно.

Ответы [ 4 ]

1 голос
/ 17 января 2010

Хммм ... Я думаю, что

header('Location: images/link_error.png');

Поскольку заголовки были ранее отправлены ?

Попробуйте разместить ob_start() в верхней части файла и посмотрите, решит ли он вашу проблему.


Вот простой способ отладки:

try {
    if (!isset($_GET['id'])) throw new Exception;

    $images = new User_Images;
    $images->display($_GET['id']);
} catch (Exception $e) {

    if (headers_sent() === false)
    {
        header('Location: images/link_error.png'); // also try using the absolute URL here
    }

    else
    {
        echo file_get_contents('http://www.google.com/intl/en_ALL/images/logo.gif');
    }
}

Если появляется логотип Google, вам нужно отследить, где вы выводите данные, или использовать ob_start() + ob_end_clean().


этот тег действительно хорош !

1 голос
/ 17 января 2010

Не могли бы вы просто присвоить изображению ошибки идентификатор по умолчанию (т.е. ноль) и использовать $ images-> display (0)? Затем изображение ошибки обрабатывается точно так же, как в успешном случае.

1 голос
/ 17 января 2010

Интересно - я бы ожидал вызова тега <img> для работы с перенаправлением. Во всяком случае, это не так. Мне было бы интересно услышать, почему нет. Кто-нибудь? * * 1002

Самый простой обходной путь, который приходит на ум - это пройти через изображение ошибки, используя fopen() и fpasshtru().

0 голосов
/ 17 января 2010

Многие места, такие как PhotoBucket, просто отображают изображение ошибки, когда возникают проблемы с загрузкой запрошенного. Обычно это предварительно созданное изображение, которое просто говорит «Ошибка изображения» или что-то еще. Когда изображения формируются динамически, нет других вариантов, кроме как возвращать 404.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...