2012-06-18 40 views
6

¿Hay alguna manera de detectar una URL de la imagen, como:La detección de URL de la imagen en C#/.NET

http://mysite.com/image.jpg 

pero con otros formatos, así? Estoy usando C# con .NET 4.0.

Algo así como

bool isImageUrl(string URL){ 
} 

edición que quería decir, si la URL apunta a una imagen. Por ejemplo, la URL

http://mysite.com/image.jpg 

es una imagen válida, pero

http://mysite.com/image 

no lo es.

+0

¿Está preguntando cómo determinar el sufijo del archivo o si el objeto es una imagen real? –

+0

No creo que la edición lo haya aclarado mucho. Tenga en cuenta que http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG es una imagen válida. ¿También quieres que eso sea cierto? – dodexahedron

+0

Creo que este enlace puede ayudarle a [Link 1] [1] [1]: http://stackoverflow.com/questions/3228984/a-better-way-to-validate-url -in-c-sharp-than-try-catch –

Respuesta

6

Puede enviar una solicitud HTTP a la URL (usando HttpWebRequest) y comprobar si el ContentType devuelto comienza con image/.

1

Puede comprobar la cadena con .EndsWith() para cada uno de los conjuntos de cadenas que defina.

Si desea saber si el objeto en esa URL es realmente una imagen, tendrá que realizar la solicitud web usted mismo y verificar el encabezado HTTP de tipo de contenido.

Incluso eso puede ser inexacto, dependiendo del servidor.

+1

incorrecto http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG – SLaks

+0

Ambos pueden ser incorrectos o correctos (¿descargar todas las imágenes para verificar su tipo?), el problema está en la pregunta en sí –

+0

Es como correcto como la pregunta lo permite. Algunos servidores web antiguos no tendrán correlaciones de tipo MIME correctas, de todos modos, especialmente para jpeg2000, png, y tal vez algunos otros formatos que terminarán apareciendo como application/octet-stream. – dodexahedron

3

Por supuesto, simplemente puede verificar si la URL termina con una extensión de archivo de imagen conocida. Sin embargo, un método más seguro es descargar realmente el recurso y comprobar, si el contenido se obtiene en realidad es una imagen:

public static bool IsUrlImage(string url) 
{ 
    try 
    { 
     var request = WebRequest.Create(url); 
     request.Timeout = 5000; 
     using (var response = request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       if (!response.ContentType.Contains("text/html")) 
       { 
        using (var br = new BinaryReader(responseStream)) 
        { 
         // e.g. test for a JPEG header here 
         var soi = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8) 
         var jfif = br.ReadUInt16(); // JFIF marker (FFE0) 
         return soi == 0xd8ff && jfif == 0xe0ff; 
        } 
       } 
      } 
     } 
    } 
    catch (WebException ex) 
    { 
     Trace.WriteLine(ex); 
     throw; 
    } 
    return false; 
} 
+2

Si bien esto funcionará, odio alentarlo. ¿Te imaginas la cantidad de solicitudes web que una sola aplicación podría generar a un montón de servidores web inocentes con algo como esto? Sé que estamos aquí para ayudar, pero ahora me siento incómodo al responder este ... – dodexahedron

+0

¿Eh? ¿Qué tiene que ver la clase WebRequest con mi comentario?En cualquier caso, sí, me doy cuenta de que un URI no tiene un significado innato. Simplemente estoy comentando el hecho de que, si bien esta es una solución * técnicamente correcta *, no es necesariamente una * buena * o * la * solución correcta para la aplicación dada. Considere el caso donde alguien construye un índice de un grupo de imágenes. Una única solicitud a una página web con 1000 enlaces de imagen genera 1000 solicitudes HTTP. Hurra. Una vez más, me doy cuenta de que estamos aquí para responder preguntas, pero la pregunta en sí misma me lleva a creer que el uso será poco elegante. – dodexahedron

+0

No es diferente. Simplemente no quería hacer el mismo comentario en las tres publicaciones con la misma respuesta. : P Mi problema no es con el método. Simplemente elegí ponerlo en su publicación porque era el mejor ejemplo de las tres publicaciones con la misma respuesta. – dodexahedron

10

Puede detemine usando el método de Http HEAD (sin necesidad de descargar toda la imagen)

bool IsImageUrl(string URL) 
{ 
    var req = (HttpWebRequest)HttpWebRequest.Create(URL); 
    req.Method = "HEAD"; 
    using (var resp = req.GetResponse()) 
    { 
     return resp.ContentType.ToLower(CultureInfo.InvariantCulture) 
        .StartsWith("image/"); 
    } 
} 
+4

Tenga en cuenta que no todos los servidores manejarán 'HEAD', y que debe pasar' OrdinalIgnoreCase' a 'StartsWith'. – SLaks

Cuestiones relacionadas