2012-06-18 9 views
6

Gibt es eine Weise, die ich eine Bild-URL erkennen kann, wie:Erkennung von Bild-URL in C#/NET

http://mysite.com/image.jpg 

aber mit anderen Formaten als auch? Ich verwende C# mit .NET 4.0.

So etwas wie

bool isImageUrl(string URL){ 
} 

bearbeiten bedeutete, dass ich, wenn die URL auf ein Bild. ZB die URL

http://mysite.com/image.jpg 

ist ein gültiges Bild, aber

http://mysite.com/image 

nicht.

+0

Fragen Sie, wie man das Dateisuffix ermittelt oder ob das Objekt ein tatsächliches Bild ist? –

+0

Ich glaube nicht, dass der Schnitt es viel klarer gemacht hat. Beachten Sie, dass http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG ein gültiges Image ist. Willst du auch, dass das wahr wird? – dodexahedron

+0

Ich denke, diese Verbindung können Sie [Verbindung 1] [1] [1] helfen: http://stackoverflow.com/questions/3228984/a-better-way-to-validate-url -in-c-sharp-than-try-catch –

Antwort

6

Sie können eine HTTP-Anforderung an die URL senden (mit HttpWebRequest) und prüfen, ob die zurückgegebene ContentType mit image/ beginnt.

1

Sie könnten einfach die Zeichenkette mit .Endswith() für jede der von Ihnen definierten Zeichenketten überprüfen.

Wenn Sie wissen möchten, ob das Objekt unter dieser URL tatsächlich ein Bild ist, müssen Sie die Web-Anfrage selbst durchführen und den Content-Type-HTTP-Header überprüfen.

Auch das kann jedoch je nach Server ungenau sein.

+1

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

+0

Beide können falsch oder richtig sein (alle Bilder herunterladen, um ihren Typ zu überprüfen?), das Problem ist in der Frage selbst –

+0

Es ist so richtig wie es die Frage erlaubt. Einige ältere Webserver haben sowieso keine korrekten MIME-Typ-Zuordnungen, insbesondere für jpeg2000, png und vielleicht einige andere Formate, die am Ende als application/octet-stream erscheinen. – dodexahedron

3

Sie können natürlich einfach überprüfen, ob die URL mit einer bekannten Bilddateiendung endet. Allerdings ist eine sicherere Methode, um tatsächlich die Ressource herunterzuladen und zu prüfen, ob die Inhalte, die Sie tatsächlich bekommen, ist ein Bild:

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

Während dies funktioniert, hasse ich es zu ermutigen. Können Sie sich vorstellen, wie viele Web-Anfragen eine einzelne Anwendung an so viele unschuldige Web-Server mit so etwas erzeugen könnte? Ich weiß, dass wir hier sind, um zu helfen, aber jetzt fühle ich mich unwohl dabei, diesen zu beantworten ... – dodexahedron

+0

Huh? Was hat die WebRequest-Klasse mit meinem Kommentar zu tun?Auf jeden Fall, ja, ich weiß, dass eine URI keine angeborene Bedeutung hat. Ich möchte lediglich darauf hinweisen, dass dies zwar eine * technisch korrekte * Lösung ist, aber nicht unbedingt eine * gute * oder * die * richtige Lösung für die gegebene Anwendung. Betrachten Sie den Fall, in dem jemand einen Index einer Reihe von Bildern erstellt. Eine einzige Anfrage an eine Webseite mit 1000 Bild-Links erzeugt somit 1000 HTTP-Anfragen. Yay. Wieder erkenne ich, dass wir nur hier sind, um Fragen zu beantworten, aber die Frage selbst lässt mich glauben, dass der Gebrauch unelegant sein wird. – dodexahedron

+0

Es ist nicht anders. Ich wollte die drei Beiträge mit der gleichen Antwort nicht gleich kommentieren. : P Mein Problem ist nicht mit der Methode. Ich habe es einfach auf deinen Post gesetzt, da es das beste Beispiel für die drei Posts mit der gleichen Antwort war. – dodexahedron

10

Sie können es detemine die HEAD Methode von HTTP (ohne das ganze Bild Download)

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

Beachten Sie, dass nicht alle Server 'HEAD' verarbeiten und dass Sie' OrdinalIgnoreCase' an 'StartsWith' übergeben müssen. – SLaks