2010-08-08 18 views
10

tengo algún problema.cómo comprobar esta URL es url de imagen?

Necesito comprobar que la URL es URL de la imagen o no? ¿Cómo puedo hacer esto?

Ejemplo: si puse http://www.google.com/ no es url de la imagen.

pero si pongo http://www.google.com/profiles/c/photos/private/AIbEiAIAAABECK386sLjh92M4AEiC3ZjYXJkX3Bob3RvKigyOTEzMmFmMDI5ODQ3MzQxNWQxY2VlYjYwYmE2ZTA4YzFhNDhlMjBmMAEFQ7chSa4PMFM0qw02kilNVE1Hpw o http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg es url de la imagen.

+0

posible duplicado de [Compruebe si existe imagen en URL remota] (http://stackoverflow.com/questions/1363925/check-whether-image-exists-on-remote-url) y en una más general nivel [¿Cómo se puede verificar si existe un archivo remoto usando PHP?] (http://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file- Existe-using-php) – Gordon

+1

posible duplicado de [la mejor manera de determinar si una URL es una imagen en PHP] (http://stackoverflow.com/questions/676949/best-way-to-determine-if-a-url -is-an-image-in-php) – Wipqozn

Respuesta

23

Si quieres estar absolutamente seguro, y su PHP está habilitado para conexiones remotas, sólo puede utilizar

getimagesize('url'); 

Si devuelve una matriz, es un tipo de imagen reconocida por PHP, incluso si la extensión de la imagen no está en la url (según su segundo enlace). Debe tener en cuenta que este método hará una conexión remota para cada solicitud, por lo que quizás las URL de caché que ya probó en una base de datos reduzcan las conexiones.

+0

¡Asegúrese de desinfectar la URL si hace esto! O mejor aún, use 'curl', que no puede (¿no debería?) Acceder al sistema de archivos. – strager

+1

Esto no ejecuta comandos, abre el archivo y lee el encabezado del archivo.¿Puede explicarme dónde está el peligro si alguien dijera como/etc/passwd como el enlace? La función simplemente devolvería FALSE. – Blizz

+0

No obstante, es un riesgo para la seguridad. ¿Qué pasa si 'getimagesize' contiene un error? ¿Qué pasa si @Giffary decide obtener más información de la imagen, y esto le da más información a un hacker potencial? No lo sé, pero IMO es mejor estar seguro que lamentarlo. – strager

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

versión duro (tratando)

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

'Desactivar informes E_NOTICE primero' ¿Por qué no usar el operador' @ 'si es necesario? – strager

11

Puede enviar un HEAD request al servidor y luego verificar el tipo de contenido. De esta forma, al menos sabrá lo que el servidor "piensa" de qué tipo es.

+0

+1 porque no tenía idea de que existía :) – Blizz

3

puede utilizar esto:

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

se puede comprobar si una URL es una imagen utilizando la función getimagesize como a continuación.

function validImage($file) { 
    $size = getimagesize($file); 
    return (strtolower(substr($size['mime'], 0, 5)) == 'image' ? true : false); 
} 

$image = validImage('http://www.example.com/image.jpg'); 
echo 'this image ' . ($image ? ' is' : ' is not') . ' an image file.'; 
+0

Primera vez que he visto ['mime']. ¿Sabes de algún lugar que puedo leer más sobre lo que es y lo que hace? –

+0

@TrevorW Creo que debería haber alguna información al respecto en la página de funciones de getimagesize http://php.net/manual/en/function.getimagesize.php – Jake

+0

Lamentablemente, a veces las extensiones mienten: '( – guival

0

Aquí hay una manera que requiere curl, pero es más rápido que getimagesize, ya que no descarga toda la imagen. Descargo de responsabilidad: verifica los encabezados, y no siempre son correctos.

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; 
    } 
Cuestiones relacionadas