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

Rya*_*yan 4 php

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

谢谢

kja*_*llo 14

检查文件的mime类型.

  • 你可以做一个HEAD请求. (5认同)

Sam*_*son 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.";
}
Run Code Online (Sandbox Code Playgroud)

输出:

    Appears to be an image

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


med*_*iev 5

我建议做一个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');
Run Code Online (Sandbox Code Playgroud)

返回

字符串'HTTP/1.1 200 OK

缓存控制:max-age = 604800

内容长度:3438

内容类型:image/png

Last-Modified:Sun,2010年1月10日09:14:52 GMT

Accept-Ranges:字节

ETag:"32741b5ed591ca1:0"

服务器:Microsoft-IIS/7.5

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

'(长度= 256)

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