当前位置 主页 > 服务器问题 > Linux/apache问题 >

    PHP判断远程图片是否存在的几种方法

    栏目:Linux/apache问题 时间:2019-12-07 09:20

    在做一个图片预览中图的东西,遇到一个问题,就是要判断远程文件是否存在(不是同一台服务器)。
    代码如下:
    复制代码 代码如下:
    //方法一
    function file_exists($url)
    {
    $ch = curl_init();
    curl_setopt($ch, curlopt_url,$url);
    curl_setopt($ch, curlopt_nobody, 1); // 不下载
    curl_setopt($ch, curlopt_failonerror, 1);
    curl_setopt($ch, curlopt_returntransfer, 1);

    if(curl_exec($ch)!==false)
    return true;
    else
    return false;
    }

    //方法二
    function file_exists2($url)
    {
    if(file_get_contents($url,0,null,0,1))
    return 1;
    else
    return 0;
    }
    //方法三
    function file_exists($url) {
    $curl = curl_init($url);
    // 不取回数据
    curl_setopt($curl, CURLOPT_NOBODY, true);
    // 发送请求
    $result = curl_exec($curl);
    $found = false;
    // 如果请求没有发送失败
    if ($result !== false) {
    // 再检查http响应码是否为200
    }

    方法一无论图片在不在都是返回FALSE;
    方法二windows下可行,LINUX下无论图片在不在都返加TRUE;
    方法三应该是最合适的
    另外:用get_headers() 方法存在效率问题,建议不使用作为此解决方案

    fsockopen版:

    复制代码 代码如下:
      $url = "/uploads/cj/201912/error.html = parse_url($url);
        $fp = fsockopen($info['host'], 80,$errno, $errstr, 30);
        fputs($fp,"GET {$info['path']} HTTP/1.1\r\n");
        fputs($fp, "Host: {$info['host']}\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        $headers = array();
        while(!feof($fp)) {
        $line = fgets($fp);
        if($line != "\r\n") {
        $headers[] = $line;
        }else {
        break;
        }
        }

        echo "<pre>";
        print_r($headers);

    通过http状态码来判断文件是否存在,比如,响应 302,301,404等都为不存在,如果是200,304,等可以视为文件存在。

    fopen()方法:
    复制代码 代码如下:
    <?php
        $url = '/uploads/cj/201912/ if( @fopen( $url, 'r' ) )
        {
            echo 'File Exits';
        }
        else
        {
            echo 'File Do Not Exits';
        }
        ?>

    CURL方法:
    复制代码 代码如下:
    <?php
        $url2 = '/uploads/cj/201912/ $ch = curl_init();
        $timeout = 10;
        curl_setopt ($ch, CURLOPT_URL, $url2);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

        $contents = curl_exec($ch);
        //echo $contents;
        if (preg_match("/404/", $contents)){