在我的应用程序中,我使用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
谢谢。
答案 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');