将浏览器重定向到新图像,在PHP中使用内容类型image / png

时间:2010-01-16 22:51:47

标签: php http header

我有一个生成图像的php脚本,并且(主要)使用如下:

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

该脚本使用我编写的类来显示与该ID匹配的图像。但是有很多事情可能会出错,而且每个事情都会引发异常。所以我有这样的事情:

<?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 + < kbd> F5 for Firefox)修复它并开始正常工作。

4 个答案:

答案 0 :(得分:1)

有趣 - 我希望调用<img>标记可以使用重定向。无论如何,它可能不会。我很想知道为什么不。任何人吗?

我们想到的最简单的解决方法是使用fopen()fpasshtru()传递错误图像。

答案 1 :(得分:1)

你能不能给错误图像一个默认ID(即零)并使用$ images-&gt; display(0)?然后处理错误图像就像成功案例一样。

答案 2 :(得分:1)

哼哼......我猜是

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()


这个标签非常好

答案 3 :(得分:0)

很多像PhotoBucket这样的地方只在加载请求的地方时才显示错误图像。这通常是预先构建的图像,只是说“图像错误”或其他什么。当图像动态组合在一起时,除了返回404之外,其他选项并不多。