【问题标题】:How to determine if a url is an image or not?如何判断一个url是不是图片?
【发布时间】:2011-01-04 19:41:32
【问题描述】:

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

谢谢

【问题讨论】:

  • 扩展程序不会告诉你它是否真的是一张图片。

标签: php


【解决方案1】:

检查文件的 MIME 类型。

【讨论】:

  • 但这需要获取文件。 OP 想从 syntax 中知道它是否是图像。不过你的答案当然是对的。
  • 你是对的。我的错。无论如何'/\.(png|jpg|gif|bmp)$/i' 也不是一个好的(安全)方式,但它当然更快更容易。
  • 你可以做一个 HEAD 请求。
【解决方案2】:

这不会告诉你它是否真的是一张图片。这只会根据 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。

【讨论】:

  • +1,有时你必须实现一些简单而有效的东西,检查 mime 类型可能很棒,但它有点过分了 imo....
  • 许多图片托管网站为以图片文件扩展名结尾的 URL 提供 HTML 页面
  • if(preg_match('/\.(png|jpg|gif|bmp)$/i', $url)) 应该这样做,因为preg_match 如果不匹配则返回0 (False),否则返回1(无需检查$matches)。您忘记了表达式周围的引号,我会将\. 放在开头,使其不匹配,例如foo.apng。 +1
【解决方案3】:

我建议发出 HTTP HEAD 请求,这样您就不需要下载整个图像,然后根据返回的字符串解析并确保 Content-Type 是 image/jpegimage/pjpegimage/gifimage/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% 的情况下不会,这就是这种方法可靠的原因。

【讨论】:

  • 响应中的内容类型可以被伪造。
【解决方案4】:

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

【讨论】:

  • 我投了赞成票,但即使响应中的内容类型也可能是伪造的或错误的。
【解决方案5】:

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

【讨论】:

  • 这是我的想法,但他想要进行语法检查。 +1 虽然。
【解决方案6】:

我赞成 preg 解决方案,但如果您真的非常想知道,请下载文件并使用系统功能进行询问(例如,对于 linux,请通过 exec 使用 file)。

【讨论】:

    【解决方案7】:

    使用 headers_list 然后检查 Content-Type http://php.net/manual/en/function.headers-list.php

    【讨论】:

    • 您的意思可能是get_headers()header_list 返回从您的服务器发送的标头
    【解决方案8】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多