使用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;
}
问题内容: 查看URL存在并且响应不是404的最佳方法是什么? 问题答案: 您可以使用 手册中的示例2 : 第一个数组元素将包含HTTP响应状态代码。您必须解析它。 请注意,示例中的函数将发出HTTP HEAD请求,这意味着它将不会获取URL的正文。这比使用GET请求(也将返回正文)更有效。 还要注意,通过设置 默认 上下文,任何使用http流上下文的后续调用现在都将发出HEAD请求。因此,确保完
问题内容: 我需要确定一个字符串是否包含我定义的自定义集中的任何字符。 您可以使用rangeOfString确定一个字符串是否包含另一个字符串。如果您一次测试一个字符,那么这当然也适用于字符。 我想知道什么是最好的方法。 问题答案: 您可以创建一个包含自定义字符集的,然后针对此字符集测试成员资格: 斯威夫特3: 对于不区分大小写的比较,请使用 (假设字符集仅包含小写字母)。 斯威夫特2: 斯威夫特
问题内容: 有没有一种方法可以使会话中断以了解用户是否在线? 即:使用登录名,设置一个$ _SESSION变量,用户超时cookie垃圾收集器更新数据库以将其状态更新为脱机。 我想要一个不涉及时间或日期的解决方案。我希望某些东西可以参加会议或类似的活动。猜测某人是否在线并不能满足我的需求。 问题答案: 不要理会时区之间的差异。没必要 每当用户访问页面时,最后一次更新其在用户表的记录中的字段。然后查
问题内容: 我有一个用Java编写的Web应用程序(Spring,Hibernate / JPA,Struts2),用户可以在其中上传图像并将其存储在文件系统中。我想缩放这些图像,以使它们具有一致的大小,以便在网站上显示。哪些库或内置函数将提供最佳结果?在做出决定时,我将考虑以下标准: 免费/开源(基本) 易于实施 结果质量 性能 可执行文件的大小 问题答案: 看一下Java Image I /
libGDX文档解释了如何将纹理绑定到SpriteBatch... 我的选择似乎是要么... > 将背景放在我用于较小游戏精灵的相同纹理中,或者... 使用单独的纹理作为背景。 但是如果我做了#2,那么在每次提交到GPU之前,我必须将SpriteBatch绑定到两个不同的纹理,文档描述这是“相当昂贵的”。 我不知道最好的办法是什么。我真的需要担心绑定到多个纹理那么多吗?还是有更好的方法我没有考虑过
正如标题所示…我试图找出开销最小的最快方法来确定记录是否存在于表中。 示例查询: 说<代码>?与< code>'TB100'交换...第一个和第二个查询将返回完全相同的结果(比如...此对话的< code>1)。最后一个查询将按预期返回< code>'TB100',如果< code>id不在表中,则返回nothing。 目的是弄清楚是否在表中,如果不在,程序接下来将插入记录,如果是,程序将跳过它或