2012-06-18 17 views
6

वहाँ एक रास्ता मैं की तरह एक चित्र URL का पता लगा सकते, है:सी # में पता लगा रहा चित्र URL/नेट

http://mysite.com/image.jpg 

लेकिन अन्य प्रारूपों के साथ साथ ही? मैं .NET 4.0 के साथ सी # का उपयोग कर रहा हूँ।

कुछ

तरह
bool isImageUrl(string 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-than-try-catch –

उत्तर

6

आप यूआरएल (HttpWebRequest का उपयोग कर) के लिए एक HTTP अनुरोध भेज सकते हैं, और जांच सकते हैं कि ContentTypeimage/ के साथ शुरू होता है या नहीं।

1

आप केवल स्ट्रिंग्स के सेट के प्रत्येक सेट के लिए EndsWith() के साथ स्ट्रिंग की जांच कर सकते हैं।

यदि आप जानना चाहते हैं कि उस यूआरएल पर ऑब्जेक्ट वास्तव में एक छवि है, तो आपको वेब अनुरोध स्वयं करना होगा और सामग्री-प्रकार HTTP शीर्षलेख की जांच करनी होगी।

हालांकि, सर्वर के आधार पर यह भी गलत हो सकता है।

+1

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

+0

दोनों गलत या सही हो सकते हैं (उनके प्रकार की जांच करने के लिए सभी छवियां डाउनलोड करें?), समस्या स्वयं प्रश्न में है –

+0

यह सही है क्योंकि सवाल यह होने की अनुमति देता है। कुछ पुराने वेब सर्वरों में सही एमआईएम प्रकार मैपिंग नहीं होंगे, वैसे भी, विशेष रूप से जेपीजी 2000, पीएनजी, और शायद कुछ अन्य प्रारूपों के लिए जो एप्लिकेशन/ऑक्टेट-स्ट्रीम के रूप में आते हैं। – dodexahedron

3

आप निश्चित रूप से जांच सकते हैं कि यूआरएल एक ज्ञात छवि फ़ाइल एक्सटेंशन के साथ समाप्त होता है या नहीं।

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 क्लास को मेरी टिप्पणी के साथ क्या करना है?किसी भी मामले में, हाँ, मुझे एहसास है कि एक यूआरआई में कोई सहज अर्थ नहीं है। मैं बस इस तथ्य पर टिप्पणी कर रहा हूं कि, यह एक * तकनीकी रूप से सही * समाधान है, लेकिन यह आवश्यक आवेदन के लिए एक * अच्छा * या * सही समाधान नहीं है। उस मामले पर विचार करें जहां कोई छवियों के समूह का सूचकांक बनाता है। इस पर 1000 छवि लिंक वाले वेब पेज पर एक ही अनुरोध इस प्रकार 1000 HTTP अनुरोध उत्पन्न करता है। वाह। दोबारा, मुझे एहसास हुआ कि हम सिर्फ सवालों के जवाब देने के लिए यहां हैं, लेकिन सवाल यह है कि मुझे विश्वास है कि उपयोग बेहद सुरुचिपूर्ण होगा। – dodexahedron

+0

यह कोई अलग नहीं है। मैं सिर्फ एक ही जवाब के साथ तीन पदों पर एक ही टिप्पणी नहीं करना चाहता था। : पी मेरी समस्या विधि के साथ नहीं है। मैंने बस इसे अपनी पोस्ट पर रखना चुना क्योंकि यह एक ही उत्तर के साथ तीन पदों का सबसे अच्छा उदाहरण था। – 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

संबंधित मुद्दे