2010-05-29 12 views
17

मैं एक HttpWebResponse से फ़ाइल को डाउनलोड और सहेजने का प्रयास कर रहा हूं लेकिन मुझे फ़ाइल (टेक्स्ट फ़ाइलों के अलावा) को ठीक से सहेजने में समस्याएं आ रही हैं।सी # HTTP अनुरोध से फ़ाइल को सहेजें

मुझे लगता है कि इस भाग के साथ क्या करना है अपने कुछ:

byte[] byteArray = Encoding.UTF8.GetBytes(http.Response.Content); 
MemoryStream stream = new MemoryStream(byteArray); 

पाठ ऊपर कोड के साथ फ़ाइलें काम ठीक है, लेकिन एक छवि के लिए सामग्री फाइल जब मैं बचाने की कोशिश यह दूषित हो जाता है। कैसे मैं एक छवि फ़ाइल को यह 'स्ट्रिंग' डेटा (और अन्य बाइनरी फ़ाइलें)

उल्लेख करने के लिए भूल लिख सकता हूं, यह नेट सीपी 3.5 है और मैं OAuth जोड़ने के लिए आदि

HttpWebResponse वर्ग के चारों ओर एक आवरण वर्ग है
+1

कृपया अपना कोड पोस्ट करें जो वास्तव में फ़ाइल को लिखता है। शायद आप इसे टेक्स्ट मोड में लिख रहे हैं। आपको इसे बाइनरी मोड में लिखना चाहिए। – Senthil

+0

@ सेंथिल: नहीं, यह पठन कोड है जो समस्याग्रस्त है - और यह पहले ही दिखाया जा चुका है। –

+0

हम्म .. एन्कोडिंग समस्या है .UTF8.GetBytes() भाग? – Senthil

उत्तर

44

समस्या यह है कि आप बाइनरी डेटा को पाठ के रूप में व्याख्या कर रहे हैं, भले ही यह नहीं है - जैसे ही आप सामग्री को बाइट्स के बजाय स्ट्रिंग के रूप में शुरू करना शुरू करते हैं, आप परेशानी में हैं। आपने अपने रैपर वर्ग का ब्योरा नहीं दिया है, लेकिन मुझे लगता है कि आपकी Content संपत्ति स्ट्रिंग लौट रही है - आप इसका उपयोग करने में सक्षम नहीं होंगे। यदि आपकी रैपर कक्षा आपको वेब प्रतिक्रिया से कच्चे डेटा पर नहीं पहुंचने देती है, तो आपको इसे संशोधित करने की आवश्यकता होगी।

आप .NET 4 का उपयोग कर रहे हैं, तो आप नए CopyTo विधि का उपयोग कर सकते हैं:

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 
:, आप नकल मैन्युअल रूप से करना करने के लिए है आप नेट 4 का उपयोग नहीं कर रहे हैं

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    input.CopyTo(output); 
} 

+0

ये मैंने सोचा कि समस्या थी। अधिक जानकारी (.NET कॉम्पैक्ट 3.5) – dkarzon

+0

@ d1k_is: दूसरा स्निपेट कॉम्पैक्ट फ्रेमवर्क (संभवतः आपकी आउटपुट स्ट्रीम को बदलने के अलावा) में ठीक काम करना चाहिए। –

+0

हाँ यह समस्या थी। इसलिए मुझे httpresponse wrapper को संशोधित करना पड़ा ताकि यह सामग्री स्ट्रिंग प्रॉपर्टी की बजाय फ़ाइल में स्ट्रीम को पढ़ सके। धन्यवाद! – dkarzon

7

WebClient.DownloadFile का उपयोग करें। आप इसे मैन्युअल रूप से कर सकते हैं (कुछ like this), लेकिन वेब क्लाइंट सरल डाउनलोड के लिए सबसे अच्छा शर्त है।

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