2012-06-18 11 views
6

Czy istnieje sposób można wykryć URL obrazu, takich jak:Wykrywanie URL obrazu w C#/.NET

http://mysite.com/image.jpg 

ale z innych formatów, jak również? Używam C# z .NET 4.0.

Coś

bool isImageUrl(string URL){ 
} 

edit miałem na myśli, jeśli punkty URL do obrazu. Np URL

http://mysite.com/image.jpg 

jest poprawny obraz, ale

http://mysite.com/image 

nie jest.

+0

Czy pytasz, jak określić przyrostek pliku lub czy obiekt jest rzeczywistym obrazem? –

+0

Nie sądzę, że edycja sprawiła, że ​​stało się to bardziej przejrzyste. Zauważ, że http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG jest prawidłowym obrazem. Czy chcesz również, aby zwracała ona prawdę? – dodexahedron

+0

Myślę ten link może Ci pomóc [Link 1] [1] [1]: http://stackoverflow.com/questions/3228984/a-better-way-to-validate-url -in-c-sharp-than-try-catch –

Odpowiedz

6

Możesz wysłać żądanie HTTP na adres URL (używając HttpWebRequest) i sprawdzić, czy zwrócony ContentType rozpoczyna się od image/.

1

Można po prostu sprawdzić ciąg z .EndsWith() dla każdego zestawu zdefiniowanych łańcuchów.

Jeśli chcesz się dowiedzieć, czy obiekt pod tym adresem URL to faktycznie obraz, będziesz musiał sam wykonać żądanie sieci i sprawdzić nagłówek HTTP typu zawartości.

Jednak może to być niedokładne, zależnie od serwera.

+1

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

+0

Oba mogą być nieprawidłowe lub poprawne (pobierz wszystkie obrazy, aby sprawdzić ich typ?), problem leży w samym pytaniu. –

+0

To jest poprawne jak pozwala na to pytanie. Niektóre starsze serwery sieciowe nie będą miały poprawnych odwzorowań typów MIME, w każdym razie, szczególnie dla jpeg2000, png, i być może kilku innych formatów, które w końcu pojawią się jako strumień aplikacji/oktetu. – dodexahedron

3

Można oczywiście sprawdzić, czy adres URL kończy się znanym rozszerzeniem pliku obrazu. Jednak bezpieczniejsza metoda jest faktycznie pobrać zasób i sprawdzić, czy zawartość masz faktycznie jest obraz:

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

Chociaż to zadziała, nie znoszę go zachęcać. Czy możesz sobie wyobrazić liczbę żądań internetowych, które pojedyncza aplikacja mogłaby wygenerować na kilka niewinnych serwerów sieciowych z czymś takim? Wiem, że jesteśmy tutaj, aby Ci pomóc, ale teraz czuję się nieswojo z odpowiedzią na ten ... – dodexahedron

+0

Huh? Co robi klasa WebRequest z moim komentarzem?W każdym razie, tak, zdaję sobie sprawę, że URI nie ma wrodzonego znaczenia. Po prostu komentuję fakt, że chociaż jest to * technicznie poprawne * rozwiązanie, niekoniecznie jest to * dobre * lub * właściwe rozwiązanie dla danej aplikacji. Rozważ przypadek, w którym ktoś tworzy indeks pęczków obrazów. Pojedyncze żądanie do strony internetowej zawierającej 1000 łączy graficznych generuje 1000 żądań HTTP. Yay. Znowu zdaję sobie sprawę, że jesteśmy tu po prostu, aby odpowiedzieć na pytania, ale samo pytanie skłania mnie do przekonania, że ​​użycie będzie nieeleganckie. – dodexahedron

+0

Nie inaczej. Po prostu nie chciałem zrobić tego samego komentarza do trzech postów z tą samą odpowiedzią. : P Mój problem nie dotyczy tej metody. Po prostu zdecydowałem się umieścić go w twoim poście, ponieważ był to najlepszy przykład trzech postów z tą samą odpowiedzią. – dodexahedron

10

Można detemine go za pomocą metody HTTP HEAD (bez pobierania całego obrazu)

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

Zauważ, że nie wszystkie serwery będą obsługiwały 'HEAD', i że powinieneś przekazać' OrdinalIgnoreCase' do 'StartsWith'. – SLaks

Powiązane problemy