2010-08-08 5 views
10

Ich habe ein Problem.Wie überprüft man diese URL ist Bild URL?

Ich muss überprüfen, die URL ist Bild URL oder nicht? Wie kann ich das machen?

Beispiel: wenn ich setzen http://www.google.com/ ist nicht Bild URL.

aber wenn ich setzen http://www.google.com/profiles/c/photos/private/AIbEiAIAAABECK386sLjh92M4AEiC3ZjYXJkX3Bob3RvKigyOTEzMmFmMDI5ODQ3MzQxNWQxY2VlYjYwYmE2ZTA4YzFhNDhlMjBmMAEFQ7chSa4PMFM0qw02kilNVE1Hpw oder http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg ist ist Bild URL.

+0

möglich Duplikat [Überprüfen Sie, ob Bild auf Remote-URL existiert] (http://stackoverflow.com/questions/1363925/check-whether-image-exists-on-remote-url) und auf einer allgemeineren level [Wie kann man überprüfen, ob eine Remote-Datei mit PHP existiert?] (http://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file- exists-using-php) – Gordon

+1

mögliches Duplikat von [beste Methode zur Bestimmung, ob eine URL ein Bild in PHP ist] (http://stackoverflow.com/questions/676949/best-way-to-determine-if-a-url -is-an-image-in-php) – Wipqozn

Antwort

23

Wenn Sie absolut sicher sein wollen, und Ihre PHP ist für Remote-Verbindungen aktiviert ist, können Sie einfach

getimagesize('url'); 

Wenn es verwenden gibt ein Array zurück, es ist ein Bildtyp, der von PHP erkannt wird, auch wenn die Bilderweiterung nicht in der URL enthalten ist (über Ihren zweiten Link). Sie müssen daran denken, dass diese Methode für jede Anfrage eine Remote-Verbindung herstellt, also könnten Sie URLs, die Sie bereits in einer Datenbank untersucht haben, mit Caches versehen, um Verbindungen zu verringern.

+0

Achten Sie darauf, die URL zu bereinigen, wenn Sie dies tun! Oder noch besser, verwenden Sie 'curl', das nicht auf das Dateisystem zugreifen kann (sollte?). – strager

+1

Dies führt keine Befehle aus, es öffnet die Datei und liest den Header der Datei.Kannst du mir erklären, wo die Gefahr liegt, wenn jemand wie/etc/passwd als Link sagen würde? Die Funktion würde nur FALSE zurückgeben. – Blizz

+0

Es ist trotzdem ein Sicherheitsrisiko. Was ist, wenn 'getimagesize' einen Fehler enthält? Was wäre, wenn @Giffary entschieden hätte, mehr Informationen von dem Bild zu erhalten, und dies gab einem potentiellen Hacker mehr Informationen? Ich weiß es nicht, aber IMO, es ist besser, als sicher zu sein. – strager

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

harte Version (nur versuchen)

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

'Schalten Sie zuerst die E_NOTICE-Meldung aus. Warum nicht den' @ '-Operator verwenden, wenn es notwendig ist? – strager

11

Sie können eine HEAD request an den Server senden und dann den Inhaltstyp prüfen. Auf diese Weise wissen Sie zumindest, was der Server "denkt", was der Typ ist.

+0

+1, weil ich keine Ahnung hatte, dass es existierte :) – Blizz

3

Kann diese verwenden:

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

Sie überprüfen können, ob eine URL ein Bild wie unten unter Verwendung der Funktion getimagesize ist.

+0

Das erste Mal habe ich ['Mime'] gesehen. Weißt du irgendwo, dass ich mehr darüber lesen kann, was es ist und tut? –

+0

@TrevorW Ich denke, es sollte einige Informationen darüber auf der Getimagesize-Funktionsseite http://php.net/manual/en/function.getimagesize.php geben – Jake

+0

Traurig, manchmal Erweiterungen liegen: '( – guival

0

Hier ist ein Weg, der curl erfordert, ist aber schneller als getimagesize, da es nicht das ganze Bild herunterladen. Haftungsausschluss: Es überprüft die Header, und sie sind nicht immer korrekt.

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; 
    } 
Verwandte Themen