谢谢。
检查文件的MIME类型。
'/\.(png|jpg|gif|bmp)$/i'
也不是一个好(安全)的方式,但它当然更快,更容易。 - kjagiello这并不能告诉你它是否真的是一张图片。这只能告诉你根据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类型。
if(preg_match('/\.(png|jpg|gif|bmp)$/i', $url))
语句,则可以实现此功能,因为preg_match
函数当匹配不成功时会返回0
(即False),反之则返回1
,所以无需检查$matches
变量。你忘记在表达式周围加上引号,并且我建议在表达式的开头加上\.
,这样就不会匹配例如foo.apng
的情况了。+1 - Felix Kling我建议进行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
Cache-Control:max-age=604800
Content-Length:3438
Content-Type:image/png
Last-Modified:Sun,10 Jan 2010 09:14:52 GMT
Accept-Ranges:bytes
ETag:“32741b5ed591ca1:0”
Server:Microsoft-IIS/7.5
Date:Wed,13 Jan 2010 20:37:47 GMT
'(长度=256)
Content-Type标题可以被篡改,但99%的情况下不会被篡改,这就是为什么该方法可靠的原因。
非图片URL仍然可以返回图像。例如,ashx或asp URL可以返回图像数据。最好的方法是检查MIME类型,即Response.ContentType。
您可以使用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
我赞同 preg 的解决方案,但如果你真的、真的想知道,那么就下载文件并使用系统函数进行询问(例如,对于 Linux,请通过 exec 使用 file
)。
使用 headers_list 然后检查 Content-Type http://php.net/manual/zh/function.headers-list.php
get_headers()
。header_list
返回从你的服务器发送出去的头信息。 - Gordon