2009-07-26 4 views
5

डाउनलोड करने के लिए WebResponse का उपयोग कैसे करें मैं WebResponse के माध्यम से wmv फ़ाइल को पकड़ने के लिए निम्न कोड का उपयोग कर रहा हूं। मैं इस फ़ंक्शन को कॉल करने के लिए थ्रेड का उपयोग कर रहा हूं:.wmv फ़ाइल

static void GetPage(object data) 
{ 
    // Cast the object to a ThreadInfo 
    ThreadInfo ti = (ThreadInfo)data; 

    // Request the URL 
    WebResponse wr = WebRequest.Create(ti.url).GetResponse(); 

    // Display the value for the Content-Length header 
    Console.WriteLine(ti.url + ": " + wr.Headers["Content-Length"]); 
    string toBeSaved = @"C:\Users\Kevin\Downloads\TempFiles" + wr.ResponseUri.PathAndQuery;   
    StreamWriter streamWriter = new StreamWriter(toBeSaved); 

    MemoryStream m = new MemoryStream(); 
    Stream receiveStream = wr.GetResponseStream(); 
    using (StreamReader sr = new StreamReader(receiveStream)) 
    { 
     while (sr.Peek() >= 0) 
     { 
      m.WriteByte((byte)sr.Read()); 
     } 
     streamWriter.Write(sr.ReadToEnd()); 
     sr.Close(); 
     wr.Close(); 
    } 

    streamWriter.Flush(); 
    streamWriter.Close(); 

    // streamReader.Close(); 
    // Let the parent thread know the process is done 
    ti.are.Set(); 

    wr.Close(); 
} 

फ़ाइल ठीक ठीक लगती है, लेकिन विंडोज मीडिया व्यूअर फ़ाइल को ठीक से नहीं खोल सकता है। फ़ाइल प्रकार का समर्थन करने में सक्षम नहीं होने के बारे में कुछ मूर्खतापूर्ण त्रुटि।

मुझे क्या अविश्वसनीय रूप से आसान चीज़ याद आ रही है?

+0

क्या आपने सत्यापित किया है कि विंडोज मीडिया व्यूअर सामान्य रूप से आपके ऐप के बाहर फ़ाइल खोलता है? – thedz

+0

हां। यह स्पष्ट होना चाहिए था। – KevDog

उत्तर

5

आपको इसे टेक्स्ट के बजाय बाइनरी के रूप में डाउनलोड करने की आवश्यकता है। यहां एक विधि है जो आपके लिए चाल चलनी चाहिए।

public void DownloadFile(string url, string toLocalPath) 
{ 
    byte[] result = null; 
    byte[] buffer = new byte[4097]; 

    WebRequest wr = WebRequest.Create(url); 

    WebResponse response = wr.GetResponse(); 
    Stream responseStream = response.GetResponseStream; 
    MemoryStream memoryStream = new MemoryStream(); 

    int count = 0; 

    do { 
     count = responseStream.Read(buffer, 0, buffer.Length); 
     memoryStream.Write(buffer, 0, count); 

     if (count == 0) { 
      break; 
     } 
    } 
    while (true); 

    result = memoryStream.ToArray; 

    FileStream fs = new FileStream(toLocalPath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 

    fs.Write(result, 0, result.Length); 

    fs.Close(); 
    memoryStream.Close(); 
    responseStream.Close(); 
} 
4

मुझे समझ नहीं आता क्यों आप एक समय में MemoryStream मीटर एक बाइट भरने कर रहे हैं, लेकिन फिर फाइल करने के लिए sr लेखन। उस बिंदु पर, मेरा मानना ​​है कि sr खाली है, और मेमोरीस्ट्रीम मीटर का कभी भी उपयोग नहीं किया जाता है।

नीचे कुछ कोड है जो मैंने एक समान कार्य करने के लिए लिखा था। यह एक समय में 32 के टुकड़ों में एक वेब रेस्पॉन्स प्राप्त करता है, और इसे सीधे फ़ाइल में डंप करता है।

public void GetStream() 
{ 
    // ASSUME: String URL is set to a valid URL. 
    // ASSUME: String Storage is set to valid filename. 

    Stream response = WebRequest.Create(URL).GetResponse().GetResponseStream(); 
    using (FileStream fs = File.Create(Storage)) 
    { 
     Byte[] buffer = new Byte[32*1024]; 
     int read = response.Read(buffer,0,buffer.Length); 
     while (read > 0) 
     { 
      fs.Write(buffer,0,read); 
      read = response.Read(buffer,0,buffer.Length); 
     } 
    } 
    // NOTE: Various Flush and Close of streams and storage not shown here. 
} 
+0

हाँ, कोड बदल रहा है और मैं कई चीजों की कोशिश कर रहा था। मुझे पोस्ट करने से पहले इसे साफ करने का बेहतर काम करना चाहिए था। मेरी गलती। – KevDog

2

आपको अपनी स्ट्रीम स्थानान्तरण करने के लिए एक StreamReader और एक StreamWriter उपयोग कर रहे हैं, लेकिन उन कक्षाओं पाठ से निपटने के लिए कर रहे हैं। आपकी फ़ाइल द्विआधारी है और संभावना है कि जब आप डेटा स्थानांतरित करते हैं तो सीआर, एलएफ और सीआर एलएफ के अनुक्रमों को गिरफ्तार किया जा सकता है। एनयूएल अक्षरों को कैसे संभाला जाता है मुझे कोई जानकारी नहीं है।

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