2014-04-24 8 views
5

मैं बैच डाउनलोडर पर काम कर रहा हूं लेकिन कुछ यूआरएल डेटा सही तरीके से नहीं भेज रहे हैं।सी # अज्ञात प्रारूप से छवि डाउनलोड करें

उदाहरण के लिए, यह पेज: http://i.imgbox.com/absMQK6A.png

किसी भी इंटरनेट ब्राउज़र में, यह पेज एक छवि से पता चलता है, लेकिन मेरा कार्यक्रम में, अजीब डेटा डाउनलोड करता है। मुझे लगता है कि यह यूआरएल नकली या संरक्षित है (मुझे एचटीएमएल अच्छी तरह से नहीं पता है।)

आईटी में बीटीडब्लू, मैं सामान्य रूप से उस छवि को सही क्लिक के साथ डाउनलोड कर सकता हूं और छवि के रूप में सहेज सकता हूं। इसलिए मैं अपने कार्यक्रम में उस व्यवहार का अनुकरण करना चाहता हूं।

मैं यह कैसे कर सकता हूं?

नीचे मेरे प्रोग्राम के कोड का हिस्सा है।

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress); 
if (Proxy != null) 
{ 
    request.Proxy = Proxy; 
} 
if (!string.IsNullOrWhiteSpace(UserAgent)) 
{ 
    request.UserAgent = UserAgent; 
} 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream downloadHttpStream = response.GetResponseStream(); 
int read = downloadHttpStream.Read(buffer, 0, buffer.Length); 
// output codes 

उपयोगकर्ता एजेन्ट स्ट्रिंग है जिसमें ब्राउज़र की जानकारी है। इस तरह के आईई, फ़ायरफ़ॉक्स आदि

धन्यवाद के रूप में ।

उत्तर

4

का उपयोग कर आप डेटा आपके कोड के साथ वापस पाने के पहले कुछ बाइट्स को देखें, तो आप देख सकते हैं कि छवि डाउनलोड कर सकते हैं है यह 1F 8B 08 से शुरू होता है। This indicates कि डेटा gzip'd डेटा है (gzip एन्कोडिंग वेब पर एक आम बात है)। आप बनाने के लिए AutomaticDecompression संपत्ति शामिल कर सकते हैं।नेट कोड स्वचालित रूप से इस डेटा को संपीड़ित करने और अपने वैध PNG (बाइट्स 89 50 4E 47 के साथ शुरू) मिलती है:

var request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress); 
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
+0

आह! यह बहुत चालाक है! मुझे नहीं पता था कि आप स्वचालित डिकंप्रेशन कर सकते हैं और पीएनजी निकालें! – Aviatrix

+0

आपको बहुत बहुत धन्यवाद! – donggas90

0

मुझे यकीन है कि अगर आप चाहते थे कि नहीं हूँ, हालांकि यह एक कोशिश

Image img; 
var request = WebRequest.Create(DownloadAddress); 

using (var response = request.GetResponse()) 
using (var stream = response.GetResponseStream()) 
{ 
    img = Bitmap.FromStream(stream); 
} 

मैं अगर आप वास्तव में इसे लोड करने के लिए या सिर्फ इसे डाउनलोड करना चाहता हूँ पता नहीं है देते हैं, लेकिन इस तरह से आप करेंगे आसानी से जाँच करने के लिए है कि क्या यह संभव

img.Save(somePath); 
+0

जवाब के लिए धन्यवाद। लेकिन 'img = बिटमैप। फ्रॉमस्ट्रीम (स्ट्रीम) पर 'ArgumentException' फेंक दें;'। – donggas90

0

हैं, क्योंकि उस Base64 में है, तो आप एक छवि नहीं मिलता है, this online converter साथ आप साइट से प्रतिक्रिया पेस्ट और यह छवि में बदलने का सिर्फ परीक्षण के लिए कर सकते हैं सक्षम हो।

इसके अलावा, ब्राउज़र Base64 इनकोडिंग छवियों के लिए समर्थन में निर्माण किया है। अतिरिक्त http अनुरोधों से बचने के लिए उन्हें अक्सर छोटे आइकन इनलाइन एम्बेड करने के लिए उपयोग किया जाता है।

कैसे अपनी समस्या को हल करने के लिए के रूप में:

  1. कोशिश करता है, तो यह काम हमेशा की तरह
  2. चेक के रूप में छवि डाउनलोड करने के लिए (अपवाद के लिए पकड़ कोशिश करते हैं और आकार के लिए जाँच)
  3. अगर वहाँ अपवाद की कोशिश कर रहे convert it from base64 like this
  4. कि एक त्रुटि दिखाने से काम नहीं करता है, तो या छवि पथ पर बाद में निरीक्षण के लिए कहीं न कहीं बचाने

इसके अलावा आप WebP छवियों के लिए भी समर्थन जोड़ सकते हैं क्योंकि वे चुपचाप अधिक से अधिक लोकप्रिय हो रहे हैं। वहाँ .net के लिए एक WebP पुस्तकालय on codeplex

+0

उत्तर के लिए धन्यवाद। वह बात थी! लेकिन अब बाइट्स को सी # स्ट्रिंग में कनवर्ट करने में समस्या है। 'बी 64 = एन्कोडिंग.एएससीआईआई.गेटस्ट्रिंग (पेजडाटा। टोएरे()); 'परिणाम वैध बेस 64 मान्य नहीं है। – donggas90

+0

@JIH कृपया बेहतर कोड समाधान के लिए टिम का कोड देखें :) लेकिन आपको अभी भी अलग-अलग सामानों के लिए अलग-अलग चेक होना चाहिए :) – Aviatrix

0

वैसे आप हमेशा

var webClient = new WebClient(); 
byte[] buffer = webClient.DownloadData("http://i.imgbox.com/absMQK6A.png"); 
संबंधित मुद्दे