2012-06-18 104 views
6

有沒有一種辦法可以檢測圖像的URL,如:在C#中檢測圖像的URL/NET

http://mysite.com/image.jpg 

但與其他格式呢?我正在使用.NET 4.0的C#。

喜歡的東西

bool isImageUrl(string URL){ 
} 

編輯我的意思是,如果該URL指向的圖像。例如,URL

http://mysite.com/image.jpg 

有效的圖像,但

http://mysite.com/image 

不是。

+0

你問如何確定文件後綴或如果對象是一個實際的圖像? –

+0

我不認爲編輯更清晰。請注意,http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG是有效的圖片。你是否也希望這個迴歸真實? – dodexahedron

+0

我認爲這個鏈接可以幫助你 [鏈接1] [1] [1]:http://stackoverflow.com/questions/3228984/a-better-way-to-validate-url -in-c-sharp-try-catch –

回答

6

您可以發送HTTP請求(使用HttpWebRequest)的URL,並檢查是否返回ContentType開始與image/

1

您可以使用.EndsWith()爲每個您定義的字符串檢查字符串。

如果您想知道該URL中的對象是否爲實際上是圖片,您必須自己執行Web請求並檢查內容類型HTTP標頭。

但是,即使這可能是不準確的,但取決於服務器。

+1

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

+0

兩者都可能是錯誤或正確的(下載所有圖片以檢查其類型?),問題本身就在問題 –

+0

這是正確的正如問題所允許的那樣。一些舊的Web服務器不會有正確的MIME類型映射,無論如何,特別是對於jpeg2000,png以及其他一些最終會以application/octet-stream形式出現的格式。 – dodexahedron

3

你當然可以簡單地檢查URL是否以已知的圖像文件擴展名結尾。然而,一個更安全的方法是實際下載資源和檢查,你實際上得到的內容是圖像:

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

雖然這將起作用,但我討厭鼓勵它。你能想象一個單一的應用程序可以產生一堆無辜的網絡服務器這樣的網絡請求的數量?我知道我們在這裏幫忙,但現在我對回答這個問題感到不安... – dodexahedron

+0

嗯? WebRequest類與我的評論有什麼關係?無論如何,是的,我意識到一個URI沒有先天的意義。我只是在評論這樣一個事實:雖然這是一個技術上正確的解決方案,但對於給定的應用程序來說,它不一定是一個好的解決方案。考慮有人建立一堆圖像的索引的情況。對其上有1000個圖像鏈接的網頁的單個請求將生成1000個HTTP請求。好極了。再一次,我意識到我們只是在這裏回答問題,但問題本身讓我相信這種使用方式不夠優雅。 – dodexahedron

+0

這沒有什麼不同。我只是不想對這三個帖子做出同樣的評論。 :P我的問題不在該方法。我只是選擇將它放在你的帖子上,因爲它是三個帖子中最好的例子,有相同的答案。 – dodexahedron

10

您可以使用http的HEAD方法detemine它(無需下載整個圖像)

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

請注意,並非所有服務器都會處理'HEAD',並且您應該將'OrdinalIgnoreCase'傳遞給'StartsWith'。 – SLaks