使用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所建议的那样,全部或最初的几个字节。