Search code examples
c#.netwindows-media-player

How to use WebResponse to Download .wmv file


I'm using the following code to grab a wmv file through a WebResponse. I'm using a thread to call this function:

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();
}

The file seems to download just fine, but Windows Media Viewer cannot open the file properly. Some silly error about not being able to support the file type.

What incredibly easy thing am I missing?


Solution

  • You just need to download it as binary instead of text. Here's a method that should do the trick for you.

    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();
    }