【问题标题】:Check if URL exist, and if it's an image检查 URL 是否存在,是否为图片
【发布时间】:2015-11-20 20:24:51
【问题描述】:

我正在尝试用一串文本检查两件事。首先,我想检查它是否是真实的 URL。然后,如果是,我想检查该 URL 是否是图像。我遇到了this answer,它说要执行以下操作:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$imageURL);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

if(curl_exec($ch)!==FALSE) {
    print_r("went Throught");
}
else {
    print_r("Failed");
}

curl_close($ch);

无论$imageURL 是什么,我总是得到Failed。我怎样才能实现以下目标:

if ($imageURL isRealUrl) {
    // Do some code
    if ($imageURL isInArrayOfImages(.png, .jpg, .GIF) {
        // Do something
    }
}

【问题讨论】:

  • 好吧,您同时使用了 $imageURL 和 $url。是哪个?
  • 为什么不用getimagesize()的答案?

标签: php curl


【解决方案1】:

您永远无法 100% 确定,但我至少会检查:

  1. 内容标题而不是扩展名(即使图像是通过“.php”或其他任何扩展名动态提供的)
  2. 检查内容长度标头以确保它大于零并且服务器未向我发送软 404
  3. 最后检查最终图像是否为重定向。 (如果是 404 页面或默认图像文件)

    $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    $content_length = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
    $content_redirect = curl_getinfo($ch, CURLINFO_REDIRECT_COUNT );
    
    $imageTypes = array('image/png','image/jpeg','image/gif');
    
    if(in_array($content_type,$imageTypes) && $content_redirect == 0 && $content_length >0){
    // is a vald image
    }
    

阻止 curl 将整个图像文件集 CURLOPT_NOBODY 下载为 true。

curl_setopt($ch, CURLOPT_NOBODY, true);

【讨论】:

  • 你好!感谢你的回答!我总是得到“工作但不是图像”phpfiddle.org/main/code/c0uz-ijv9
  • 移动 curl_close($ch); 到最后,一旦你调用了所有与 curl 相关的信息并且最后一个请求被重置。
  • 感谢您的回答!如果我想从我发送给您的 phpfiddle 中的所有 if 语句中是否为假开始,该怎么办?我想我会添加“!”在每个声明之前。当我这样做时,我没有得到正确的结果。为什么所有开始的 if 语句都是假的,而 else 是真的?也就是说,if 语句会输出“failed”,else 会输出“Worked”。
  • 是的,您可以将两个if 条件合并为一个,它们只是一系列&& 条件。
  • 如果文件已被删除或移动,服务器可能会将您重定向到默认图像。在某些情况下,当您发送太多请求或图像托管帐户超过一定的传输带宽时,某些照片托管站点可能会这样做。但是是的,在某些情况下,遵循重定向可能是可以的,例如脸书短网址
【解决方案2】:

您可以使用 URL 标头,而不是使用 cURL。虽然这不是 100% 万无一失的,因为一些服务器发送了不正确的标头,但它仍然非常可靠,因为它适用于通过脚本传递的大多数图像。唯一的另一种方法是使用getimagesize(),但这会将整个图像下载到您的服务器。

无论如何,这里有一个建议的脚本:

<?php

// URL
$url = "http://www.someurl.com/image.jpg";

// Check if URL exists
$get_headers = @get_headers($url);

if($get_headers[0] == 'HTTP/1.1 404 Not Found') {
    $url_exists = false;
} else {
    $url_exists = true;
}

// Check if URL is image using the same headers
if($url_exists){
    if(isset($get_headers['Content-Type'])){

        $type = strtolower($get_headers['Content-Type']);

        $valid_image_type = array();
        $valid_image_type['image/png']      = '';
        $valid_image_type['image/jpg']      = '';
        $valid_image_type['image/jpeg']     = '';
        $valid_image_type['image/jpe']      = '';
        $valid_image_type['image/gif']      = '';
        $valid_image_type['image/tif']      = '';
        $valid_image_type['image/tiff']     = '';
        $valid_image_type['image/svg']      = '';
        $valid_image_type['image/ico']      = '';
        $valid_image_type['image/icon']     = '';
        $valid_image_type['image/x-icon']   = '';
        $valid_image_type['image/bmp']      = '';

        if(isset($valid_image_type[$type])){
            // URL is image
        } else {
            // URL isn't an image
        }
    }
} else {
    // URL doesn't exist
}

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2016-07-27
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多