当前位置: 首页 > 面试题库 >

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

孙永思
2023-03-14
问题内容

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

问题答案:

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

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



 类似资料:
  • 问题内容: 查看URL存在并且响应不是404的最佳方法是什么? 问题答案: 您可以使用 手册中的示例2 : 第一个数组元素将包含HTTP响应状态代码。您必须解析它。 请注意,示例中的函数将发出HTTP HEAD请求,这意味着它将不会获取URL的正文。这比使用GET请求(也将返回正文)更有效。 还要注意,通过设置 默认 上下文,任何使用http流上下文的后续调用现在都将发出HEAD请求。因此,确保完

  • 问题内容: 我需要确定一个字符串是否包含我定义的自定义集中的任何字符。 您可以使用rangeOfString确定一个字符串是否包含另一个字符串。如果您一次测试一个字符,那么这当然也适用于字符。 我想知道什么是最好的方法。 问题答案: 您可以创建一个包含自定义字符集的,然后针对此字符集测试成员资格: 斯威夫特3: 对于不区分大小写的比较,请使用 (假设字符集仅包含小写字母)。 斯威夫特2: 斯威夫特

  • 问题内容: 有没有一种方法可以使会话中断以了解用户是否在线? 即:使用登录名,设置一个$ _SESSION变量,用户超时cookie垃圾收集器更新数据库以将其状态更新为脱机。 我想要一个不涉及时间或日期的解决方案。我希望某些东西可以参加会议或类似的活动。猜测某人是否在线并不能满足我的需求。 问题答案: 不要理会时区之间的差异。没必要 每当用户访问页面时,最后一次更新其在用户表的记录中的字段。然后查

  • 问题内容: 我有一个用Java编写的Web应用程序(Spring,Hibernate / JPA,Struts2),用户可以在其中上传图像并将其存储在文件系统中。我想缩放这些图像,以使它们具有一致的大小,以便在网站上显示。哪些库或内置函数将提供最佳结果?在做出决定时,我将考虑以下标准: 免费/开源(基本) 易于实施 结果质量 性能 可执行文件的大小 问题答案: 看一下Java Image I /

  • 正如标题所示…我试图找出开销最小的最快方法来确定记录是否存在于表中。 示例查询: 说<代码>?与< code>'TB100'交换...第一个和第二个查询将返回完全相同的结果(比如...此对话的< code>1)。最后一个查询将按预期返回< code>'TB100',如果< code>id不在表中,则返回nothing。 目的是弄清楚是否在表中,如果不在,程序接下来将插入记录,如果是,程序将跳过它或

  • libGDX文档解释了如何将纹理绑定到SpriteBatch... 我的选择似乎是要么... > 将背景放在我用于较小游戏精灵的相同纹理中,或者... 使用单独的纹理作为背景。 但是如果我做了#2,那么在每次提交到GPU之前,我必须将SpriteBatch绑定到两个不同的纹理,文档描述这是“相当昂贵的”。 我不知道最好的办法是什么。我真的需要担心绑定到多个纹理那么多吗?还是有更好的方法我没有考虑过