2010-08-08 10 views
10

ho qualche problema.come controllare questo URL è l'URL dell'immagine?

Ho bisogno di controllare l'url è l'URL dell'immagine o no? Come posso fare questo?

Esempio: se metto http://www.google.com/ non è l'immagine.

ma se metto http://www.google.com/profiles/c/photos/private/AIbEiAIAAABECK386sLjh92M4AEiC3ZjYXJkX3Bob3RvKigyOTEzMmFmMDI5ODQ3MzQxNWQxY2VlYjYwYmE2ZTA4YzFhNDhlMjBmMAEFQ7chSa4PMFM0qw02kilNVE1Hpw o http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg è l'url dell'immagine.

+0

possibile duplicato del [Verificare se esiste un'immagine su URL remoto] (http://stackoverflow.com/questions/1363925/check-whether-image-exists-on-remote-url) e su un più generale livello [Come si può verificare se esiste un file remoto utilizzando PHP?] (http://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file- exists-using-php) – Gordon

+1

possibile duplicato di [modo migliore per determinare se un URL è un'immagine in PHP] (http://stackoverflow.com/questions/676949/best-way-to-determine-if-a-url -is-an-image-in-php) – Wipqozn

risposta

23

Se si vuole essere assolutamente sicuro, e il tuo PHP è abilitato per le connessioni remote, si può semplicemente utilizzare

getimagesize('url'); 

Se restituisce un array, è un tipo di immagine riconosciuto da PHP, anche se l'estensione dell'immagine non è nell'url (secondo il tuo secondo link). Devi tenere a mente che questo metodo creerà una connessione remota per ogni richiesta, quindi forse gli url di cache che hai già sondato in un database per ridurre le connessioni.

+0

Assicurati di disinfettare l'URL se lo fai! O meglio ancora, usa 'arricciato ', che non può (non dovrebbe?) Accedere al filesystem. – strager

+1

Questo non esegue i comandi, apre il file e legge l'intestazione del file.Puoi spiegarmi dove si trova il pericolo se qualcuno direbbe come/etc/passwd come link? La funzione restituirebbe solo FALSE. – Blizz

+0

È comunque un rischio per la sicurezza. Cosa succede se 'getimagesize' contiene un bug? Che cosa succede se @Giffary ha deciso di ottenere maggiori informazioni dall'immagine e questo ha fornito ulteriori informazioni a un potenziale hacker? Non lo so, ma IMO è meglio prevenire che curare. – strager

0
$ext = strtolower(end(explode('.', $filename))); 
switch($ext) 
{ 
case 'jpg': 
///Blah 
break; 
} 

versione disco (solo cercando)

//Turn off E_NOTICE reporting first 
if(getimagesize($url) !== false) 
{ 
//Image 
} 
+1

'Disattiva prima i rapporti di E_NOTICE' Perché non utilizzare l'operatore' @ 'se è necessario? – strager

11

È possibile inviare un HEAD request al server e quindi controllare il tipo di contenuto. In questo modo, almeno sai cosa il server "pensa" di che tipo si tratta.

+0

+1 perché non avevo idea dell'esistenza :) – Blizz

3

possibile utilizzare questo:

$is = @getimagesize ($link); 
if (!$is) $link=''; 
elseif (!in_array($is[2], array(1,2,3)) ) $link=''; 
elseif (($is['bits']>=8)) $srcs[] = $link; 
4

È possibile verificare se un URL è un'immagine utilizzando la funzione getimagesize come qui di seguito.

+0

La prima volta che ho visto ['mime']. Sai da qualche parte che posso leggere di più su cosa sia e cosa faccia? –

+0

@TrevorW Penso che ci dovrebbero essere alcune informazioni a riguardo nella pagina della funzione getimagesize http://php.net/manual/en/function.getimagesize.php – Jake

+0

Purtroppo, a volte le estensioni mentono: '( – guival

0

Ecco un modo che richiede il ricciolo, ma è più veloce di getimagesize, in quanto non scarica l'intera immagine. Disclaimer: controlla le intestazioni e non sempre sono corrette.

function is_url_image($url){ 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_HEADER, 1); 
     curl_setopt($ch, CURLOPT_NOBODY, 1); 
     $output = curl_exec($ch); 
     curl_close($ch); 

     $headers = array(); 
     foreach(explode("\n",$output) as $line){ 
      $parts = explode(':' ,$line); 
      if(count($parts) == 2){ 
       $headers[trim($parts[0])] = trim($parts[1]); 
      } 

     } 

     return isset($headers["Content-Type"]) && strpos($headers['Content-Type'], 'image/') === 0; 
    }