一尘不染

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

php

使用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;
  }

阅读 213

收藏
2020-05-26

共1个答案

一尘不染

您可以使用HTTP
HEAD
请求并检查内容类型。这可能是一个很好的折衷方案。可以使用PHP
Streams
完成。Wez
Furlong的文章显示了如何使用这种方法发送发布请求,但是可以很容易地将其修改为发送HEAD请求。您可以使用stream_get_meta_data()从http响应中检索标头。

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

2020-05-26