如何确定网址是否为图片?

时间:2010-01-13 20:20:39

标签: php

我想从语法中知道url是否是图片。 示例:http://www.blah.com/plo52.jpg或png或gif将返回true。 如果url以其他扩展名结尾,则该函数将返回false。

由于

8 个答案:

答案 0 :(得分:14)

检查文件的mime类型。

答案 1 :(得分:8)

这不会告诉你它是否真的一张图片。这只会根据网址告诉你出现的内容:

$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.";
}

输出:

    Appears to be an image

请注意,如果您希望看到通过.php脚本或.aspx脚本提供的图像,则此方法将失败。要进行真正可靠的测试,您需要检查mime类型。

答案 2 :(得分:5)

我建议您创建 HTTP HEAD 请求,这样您就不需要下载整个图像,然后根据返回的字符串解析并确保Content-Type为{{1} },image/jpegimage/pjpegimage/gif或类似图片内容类型。

image/png

返回

  

string'HTTP / 1.1 200 OK

     

缓存控制:max-age = 604800

     

内容长度:3438

     

内容类型:image / png

     

Last-Modified:Sun,2010年1月10日   格林尼治标准时间09:14:52

     

Accept-Ranges:bytes

     

ETag:“32741b5ed591ca1:0”

     

服务器:Microsoft-IIS / 7.5

     

日期:2010年1月13日星期三20:37:47 GMT

     

'(长度= 256)

Content-Type标头可以被欺骗,当然..但99%的时间它不会,这就是为什么这种方法可靠。

答案 3 :(得分:3)

非图片网址仍然可以流式传输图片。例如,ashx或asp URL可以返回图像数据。最好的方法是检查MIME类型Response.ContentType。

答案 4 :(得分:2)

如果您确实需要100%确定,则需要下载资源并使用getimagesize()进行检查。

答案 5 :(得分:1)

我赞成了preg解决方案,但如果你真的,真的想知道然后下载文件并使用系统函数询问(例如通过exec使用linux file。)

答案 6 :(得分:1)

您可以使用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的问题和答案:

答案 7 :(得分:1)

使用headers_list,然后检查内容类型http://php.net/manual/en/function.headers-list.php