2012-05-04 13 views
8

Mi file_exists() devuelve un valor falso aunque haya proporcionado una imagen para comprobar https://www.google.pl/logos/2012/haring-12-hp.png. ¿Por qué?file_exists() devuelve falso aunque exista un archivo (URL remota)

A continuación les presento código completo PHP defecto listo para disparar en localhost:

$filename = 'https://www.google.pl/logos/2012/haring-12-hp.png'; 
echo "<img src=" . $filename . " />"; 
if (file_exists($filename)) { 
    echo "The file $filename exists"; 
} else { 
    echo "The file $filename does not exist"; 
} 
+5

Entonces, usted es dueño de google, ¿eh? 'Comprueba si existe un archivo o directorio. Local solamente. – Blake

Respuesta

29
$filename= 'https://www.google.pl/logos/2012/haring-12-hp.png'; 
$file_headers = @get_headers($filename); 

if($file_headers[0] == 'HTTP/1.0 404 Not Found'){ 
     echo "The file $filename does not exist"; 
} else if ($file_headers[0] == 'HTTP/1.0 302 Found' && $file_headers[7] == 'HTTP/1.0 404 Not Found'){ 
    echo "The file $filename does not exist, and I got redirected to a custom 404 page.."; 
} else { 
    echo "The file $filename exists"; 
} 
+0

¿Qué sucede si el enlace en lugar de la imagen (que no existe) va a la página 404 de error personalizado? –

+0

Oye, mira los nuevos cambios al código. Ahora comprueba si aterrizó en una página 404 personalizada. –

+0

Hmm y lo enlaza bien a la página 404 'http: //services.runescape.com/m=itemdb_rs/3716_obj_sprite.gif? Id = 1' falla. –

5

A partir de PHP 5.0.0, esta función también puede usarse con algunas URL. Consulte los Protocolos soportados y Wrappers para determinar qué envoltorios son compatibles con la familia de funcionalidades stat().

Desde el http(s) page en Supported Protocols and Wrappers:

Supports stat() No 
+0

¿Qué pasa con la URL: 'http: //services.runescape.com/m=itemdb_rs/3716_obj_sprite.gif? Id = 2'? –

+0

No importa cuál sea la URL; 'http' y' https' no son compatibles con 'stat()'. – Amber

+0

Gracias por su apoyo. –

-1

Lo que necesita es algo así como url_exists. Se refieren a los comentarios de los file_exists docs: http://php.net/manual/en/function.file-exists.php

Aquí está uno de los ejemplos publicado:

<?php 
    function url_exists($url){ 
     $url = str_replace("http://", "", $url); 
     if (strstr($url, "/")) { 
      $url = explode("/", $url, 2); 
      $url[1] = "/".$url[1]; 
     } else { 
      $url = array($url, "/"); 
     } 

     $fh = fsockopen($url[0], 80); 
     if ($fh) { 
      fputs($fh,"GET ".$url[1]." HTTP/1.1\nHost:".$url[0]."\n\n"); 
      if (fread($fh, 22) == "HTTP/1.1 404 Not Found") { return FALSE; } 
      else { return TRUE; } 

     } else { return FALSE;} 
    } 
?> 
+2

Ese ejemplo es bastante malo. Sería mejor usar cURL para hacer una solicitud 'HEAD'. – Amber

5

Una mejor si la declaración de que no se ve en http versión

$file_headers = @get_headers($remote_filename);  
if (stripos($file_headers[0],"404 Not Found") >0 || (stripos($file_headers[0], "302 Found") > 0 && stripos($file_headers[7],"404 Not Found") > 0)) { 
//throw my exception or do something 
} 
0
$filename = "http://im.rediff.com/money/2011/jan/19sld3.jpg"; 

    $file_headers = @get_headers($filename); 

    if($file_headers[0] == 'HTTP/1.1 404 Not Found') { 
    //return false; 
    echo "file not found"; 
    }else { 
    //return true; 
    echo "file found"; 

    } 
+0

Hazlo con 'https: // www.google.pl/logos/2012/haring-12-hp.png' ¿está funcionando? –

0
function check_file ($file){ 

    if (!preg_match('/\/\//', $file)) { 
     if (file_exists($file)){ 
      return true; 
     } 
    } 

    else { 

     $ch = curl_init($file); 
     curl_setopt($ch, CURLOPT_NOBODY, true); 
     curl_exec($ch); 
     $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

     if($code == 200){ 
      $status = true; 
     }else{ 
      $status = false; 
     } 
     curl_close($ch); 
     return $status; 

    } 

    return false; 

} 
Cuestiones relacionadas