如果函数中使用的图像返回错误,如何找到“找不到图像”图标?

时间:2011-09-23 12:40:46

标签: php

在我的应用程序中,我使用timthumb来调整图像大小。这些图像不是由我控制的,因为我从RSS源中获取它们。有时图像不会显示在我的页面中。当我用timthumb检查整个链接时,我得到了这个

  

警告:imagecreatefromjpeg(http://www.domain.com/image.jpg)   [function.imagecreatefromjpeg]:无法打开流:HTTP请求   失败!在第193行的/timthumb.php中找不到HTTP / 1.1 404无法访问   打开图片:http://www.domain.com/image.jpg

所以,我正在寻找一种方法来了解图像何时返回错误,以便我不会在页面上显示它(红色X图标)。

从我的RSS源中,我使用正则表达式来获取第一个图像

if (thumb[0]) { show the image using timthumb } 

else { show a no-image icon } 

但上面的例子属于“使用timthumb显示图像”。

这是我代码中的粘贴 http://codepad.org/7aFXE8ZY

谢谢。

5 个答案:

答案 0 :(得分:4)

您可以使用一个函数,使用curl获取给定网址的标头,并检查HTTP状态代码和image/*内容类型。

如果您的网址引用图片,则以下函数将返回true,否则返回false

注意curl_setopt($ch, CURLOPT_NOBODY, 1);行告诉curl只获取给定页面的标题而不是整个内容。通过这种方式,您可以在检查图像存在时节省带宽。

<?php
function image_exist($url, $check_mime_type = true) {    
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

    $result = curl_exec($ch);

    if (!preg_match('/^HTTP\/1.1 200 OK/i', $result)) {
        // status != 200, handle redirects, not found, forbidden and so on
        return false;
    }
    if ($check_mime_type && !preg_match('/^Content-Type:\\s+image\/.*$/im', $result)) {
        // mime != image/*
        return false;
    }
    return true;
}

$url = 'http://static.php.net/www.php.net/images/php.gif';
var_dump(image_exist($url)); // return true since it's an image
$bogus_url = 'http://www.google.com/foobar';
var_dump(image_exist($bogus_url)); // return false since page doesn't exist
$text_url = 'http://stackoverflow.com/';
var_dump(image_exist($text_url)); // return false since page exists but it's a text page

通过使用此代码,您可以避免使用@错误抑制运算符,该运算符不应使用,仅在存在时才获取实际图像。

@很糟糕,因为它会抑制致命的错误,所以你的脚本会因为空白页而死,你不知道为什么因为它会将error_reporting设置为0并将其恢复到之前的值,请参阅警告here

此外,它会降低您的代码速度,如this comment及其后的报道。

答案 1 :(得分:1)

如果imagecreatefromjpeg跨越错误(如文件不可读),它将返回false,并根据服务器配置输出错误消息。输出错误消息(或任何)使php自动发送请求标头。发送标题后,您无法将其取回以表明您实际上是在发送图像而不是HTML文档。

因此,您可能希望抑制错误输出,如下所示:

set_error_handler(function($en, $es) {}, E_WARNING);
$im = imagecreatefromjpeg($url);
restore_error_handler();
if ($im === false) {
   header('Content-Type: image/jpeg');
   readfile('static/red-x-icon.jpeg');
   exit();
}
// Continue processing $im, eventually send headers and the image itself

答案 2 :(得分:0)

使用set_error_handler()创建错误处理程序,如果抛出错误,则返回空白图像,并可能将错误记录在其他位置。

答案 3 :(得分:0)

为什么不先see if you can open the image file

function fileExists($path){
    return (@fopen($path,"r")==true);
}

$img = 'no_image.jpg';
if (fileExists(thumb[0])) {
    $img = thumb[0];
}

另外,您是否正在检查以确保没有将非jpeg(PNG等)图像传递给imagecreatefromjpeg()?

答案 4 :(得分:0)

当未设置用户代理时页面不允许下载图像时,可能会出现此问题。在运行imagecreatefromjpeg之前尝试设置一个。例如:

ini_set('user_agent', 'Mozilla/5.0 (Windows NT 5.1; U; rv:5.0) Gecko/20100101 Firefox/5.0');