在 PHP 中确定 URL 是否为图像的最佳方法

2022-08-30 09:41:32

使用PHP,给定一个URL,我如何确定它是否是图像?

URL没有上下文 - 它只是在纯文本文件的中间,或者可能只是一个字符串本身。

我不希望高开销(例如读取URL的内容),因为可以对页面上的许多URL调用。鉴于此限制,识别所有图像并不重要,但我想要一个相当好的猜测。

目前,我只是在看文件扩展名,但感觉应该有比这更好的方法。

以下是我目前拥有的内容:

  function isImage( $url )
  {
    $pos = strrpos( $url, ".");
    if ($pos === false)
      return false;
    $ext = strtolower(trim(substr( $url, $pos)));
    $imgExts = array(".gif", ".jpg", ".jpeg", ".png", ".tiff", ".tif"); // this is far from complete but that's always going to be the case...
    if ( in_array($ext, $imgExts) )
      return true;
    return false;
  }

编辑:如果它对其他人有用,这里的最终函数是使用Emil H的答案中的技术:

  function isImage($url)
  {
     $params = array('http' => array(
                  'method' => 'HEAD'
               ));
     $ctx = stream_context_create($params);
     $fp = @fopen($url, 'rb', false, $ctx);
     if (!$fp) 
        return false;  // Problem with url

    $meta = stream_get_meta_data($fp);
    if ($meta === false)
    {
        fclose($fp);
        return false;  // Problem reading data from url
    }

    $wrapper_data = $meta["wrapper_data"];
    if(is_array($wrapper_data)){
      foreach(array_keys($wrapper_data) as $hh){
          if (substr($wrapper_data[$hh], 0, 19) == "Content-Type: image") // strlen("Content-Type: image") == 19 
          {
            fclose($fp);
            return true;
          }
      }
    }

    fclose($fp);
    return false;
  }

答案 1

您可以使用 HTTP HEAD 请求并检查内容类型。这可能是一个很好的折衷方案。它可以使用PHP流完成。Wez Furlong有一篇文章展示了如何使用这种方法发送post请求,但它可以很容易地适应于发送HEAD请求。您可以使用 stream_get_meta_data() 从 http 响应中检索标头。

当然,这并不是100%。某些服务器发送不正确的标头。但是,它将处理通过脚本传递图像并且不正确的文件扩展名不可用的情况。真正确定的唯一方法是实际检索图像 - 要么是全部图像,要么是前几个字节,如thomasrutter所建议的那样。


答案 2
if(is_array(getimagesize($urlImg)))
    echo 'Yes it is an image!';

推荐