【发布时间】:2011-01-04 19:41:32
【问题描述】:
我想从语法中知道 url 是否是图片。 例如:http://www.blah.com/plo52.jpg 或 png 或 gif 将返回 true。 如果 url 以其他扩展名结尾,该函数将返回 false。
谢谢
【问题讨论】:
-
扩展程序不会告诉你它是否真的是一张图片。
标签: php
我想从语法中知道 url 是否是图片。 例如:http://www.blah.com/plo52.jpg 或 png 或 gif 将返回 true。 如果 url 以其他扩展名结尾,该函数将返回 false。
谢谢
【问题讨论】:
标签: php
检查文件的 MIME 类型。
【讨论】:
'/\.(png|jpg|gif|bmp)$/i' 也不是一个好的(安全)方式,但它当然更快更容易。
这不会告诉你它是否真的是一张图片。这只会根据 url 告诉你它 看起来 是什么:
$url = "http://somedomain.com/images/kittens.jpg";
if(preg_match("/\.(png|jpeg|jpg|gif|bmp)$/i", $url)) {
print "Appears to be an image";
} else {
print "Not an image.";
}
输出:
似乎是一张图片
请注意,如果您希望看到通过 .php 脚本或 .aspx 脚本提供的图像,则此方法将失败。要进行真正可靠的测试,您需要检查 mime-type。
【讨论】:
if(preg_match('/\.(png|jpg|gif|bmp)$/i', $url)) 应该这样做,因为preg_match 如果不匹配则返回0 (False),否则返回1(无需检查$matches)。您忘记了表达式周围的引号,我会将\. 放在开头,使其不匹配,例如foo.apng。 +1
我建议发出 HTTP HEAD 请求,这样您就不需要下载整个图像,然后根据返回的字符串解析并确保 Content-Type 是 image/jpeg, image/pjpeg、image/gif、image/png 或类似的图像内容类型。
<?php
function parseImage( $url ) {
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 20 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_HEADER, true );
curl_setopt( $ch, CURLOPT_NOBODY, true );
$content = curl_exec( $ch );
var_dump($content);
curl_close($ch);
}
parseImage('http://sstatic.net/so/img/logo.png');
返回
字符串'HTTP/1.1 200 OK
缓存控制:max-age=604800
内容长度:3438
内容类型:图片/png
最后修改时间:2010 年 1 月 10 日,星期日 格林威治标准时间 09:14:52
接受范围:字节
ETag:“32741b5ed591ca1:0”
服务器:Microsoft-IIS/7.5
日期:格林威治标准时间 2010 年 1 月 13 日,星期三 20:37:47
'(长度=256)
Content-Type 标头可以被欺骗,当然.. 但 99% 的情况下不会,这就是这种方法可靠的原因。
【讨论】:
非图像 URL 仍然可以流回图像。例如,ashx 或 asp URL 可能会返回图像数据。最好的方法是检查 MIME 类型,Response.ContentType。
【讨论】:
如果您确实需要 100% 确定,则需要下载资源并使用 getimagesize() 进行检查。
【讨论】:
我赞成 preg 解决方案,但如果您真的非常想知道,请下载文件并使用系统功能进行询问(例如,对于 linux,请通过 exec 使用 file)。
【讨论】:
使用 headers_list 然后检查 Content-Type http://php.net/manual/en/function.headers-list.php
【讨论】:
get_headers()。 header_list 返回从您的服务器发送的标头
您可以使用pathinfo 获取扩展名:
echo pathinfo('http://www.blah.com/plo52.jpg', PATHINFO_EXTENSION); // jpg
然后将其包装成一个函数
function hasExtension($uri, array $extensions = array('jpg','gif','png'))
{
return in_array(pathinfo($uri, PATHINFO_EXTENSION), $extensions);
}
hasExtension('http://www.blah.com/plo52.jpg'); // true
这也适用于常规文件路径,并且通过能够传递 $extension 数组,您将不受正则表达式模式的限制。请注意,该函数区分大小写。
查看how to best determine the MimeType of a file的这个问题和答案:
【讨论】: