2013-02-11 19 views
5

Questo sputa un intero mucchio di NO, ma le immagini sono lì e il percorso corretto come sono visualizzati da <img>.Come verificare se esiste un file immagine remoto in PHP?

foreach ($imageNames as $imageName) 
{ 
    $image = 'http://path/' . $imageName . '.jpg'; 
    if (file_exists($image)) { 
     echo 'YES'; 
    } else { 
     echo 'NO'; 
    } 
    echo '<img src="' . $image . '">'; 
} 
+2

L'URL di un file di immagine e il percorso dello stesso file di immagine sul file system del server sono ** due stringhe diverse **. –

+0

Ok questo ha senso. Sarei stato in errore sfogliando su altri post utilizzando percorsi remoti con file_exist. – TijuanaKez

risposta

13

file_exists utilizza percorso locale, non un URL.

Una soluzione potrebbe essere questa:

$url=getimagesize(your_url); 

if(!is_array($url)) 
{ 
    // The image doesn't exist 
} 
else 
{ 
    // The image exists 
} 

Vedi questo per più information.

Inoltre, cercare le intestazioni di risposta (utilizzando la funzione get_headers) sarebbe un'alternativa migliore. Basta controllare se la risposta è 404:

if(@get_headers($your_url)[0] == 'HTTP/1.1 404 Not Found') 
{ 
    // The image doesn't exist 
} 
else 
{ 
    // The image exists 
} 
+3

Questo è molto costoso. L'intera immagine viene scaricata prima che le informazioni vengano recuperate. Stai meglio guardando solo le intestazioni della tua richiesta. Cerca in get_headers(). http://php.net/manual/en/function.get-headers.php –

+0

@GeneKelly Grazie! Aggiornato. –

+0

Questa è una risposta superba (con le intestazioni). Ma restituisce sempre le stesse intestazioni su server diversi? Scusa per la mia ignoranza su questo. – itsols

13

file_exists cerca un percorso locale, non un "http: //" URL

uso:

$file = 'http://www.domain.com/somefile.jpg'; 
$file_headers = @get_headers($file); 
if($file_headers[0] == 'HTTP/1.1 404 Not Found') { 
    $exists = false; 
} 
else { 
    $exists = true; 
} 
+0

@Phil l'hai provato con un URL? Restituisce false: http://codepad.viper-7.com/56dDzt – Mike

+0

se il server restituisce: HTTP/1.1 403? – realization

+0

Se è 403, l'immagine non è ancora accessibile, ma esiste. –

2
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 
if($retcode==200) echo 'YES'; 
else    echo 'NO'; 
+1

Spiega il tuo codice un po ' – andy

0
function remote_file_exists($file){ 

$url=getimagesize($file); 

if(is_array($url)) 
{ 

return true; 

} 
else { 

return false; 

} 

$file='http://www.site.com/pic.jpg'; 

echo remote_file_exists($file); // return true if found and if not found it will return false 
1

Questo è quello che ho fatto. Comprende più risultati possibili ottenendo le intestazioni perché se non puoi accedere al file non è sempre solo "404 non trovato". A volte è "Moved Permanently", "Forbidden" e altri possibili messaggi. Tuttavia è solo "200 OK" se il file esiste ed è accessibile. La parte con HTTP può avere 1.1 o 1.0 dopo di essa, ed è per questo che ho appena usato strpos per essere più affidabile per ogni situazione.

$file_headers = @get_headers('http://example.com/image.jpg'); 

$is_the_file_accessable = true; 

if(strpos($file_headers[0], ' 200 OK') !== false){ 
    $is_the_file_accessable = false; 
} 

if($is_the_file_accessable){ 
    // THE IMAGE CAN BE ACCESSED. 
} 
else 
{ 
    // THE IMAGE CANNOT BE ACCESSED. 
} 
Problemi correlati