2009-07-26 2 views
5

Ich verwende den folgenden Code, um eine WMV-Datei über eine WebResponse zu erfassen. Ich bin mit einem Faden, diese Funktion aufzurufen:So verwenden Sie WebResponse zum Herunterladen .wmv-Datei

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

Die Datei einfach gut zum Download erscheint, aber Windows Media Viewer kann die Datei nicht richtig öffnen. Ein dummer Fehler, dass der Dateityp nicht unterstützt werden kann.

Was unglaublich einfache Sache vermisse ich?

+0

Haben Sie überprüft, dass Windows Media Viewer die Datei normalerweise außerhalb Ihrer App öffnet? – thedz

+0

Ja. Sollte das klar gemacht haben. – KevDog

Antwort

5

Sie müssen es nur als Binär anstelle von Text herunterladen. Hier ist eine Methode, die den Trick für Sie tun sollte.

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

Ich verstehe nicht, warum Sie Memory m ein Byte zu einem Zeitpunkt füllen, aber dann das Schreiben der sr in die Datei. An diesem Punkt glaube ich, sr ist leer, und MemoryStream m wird nie verwendet.

Unten ist ein Code, den ich geschrieben habe, um eine ähnliche Aufgabe zu erledigen. Es ruft eine WebResponse in 32K-Blöcken gleichzeitig ab und speichert sie direkt in einer Datei.

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

Ja, der Code wurde ständig geändert und ich habe mehrere Dinge versucht. Ich hätte es besser erledigen sollen, bevor ich posten könnte. Mein Fehler. – KevDog

2

Sie verwenden ein StreamReader und ein StreamWriter Stream zu übertragen, aber diese Klassen sind für Text Handhabung. Ihre Datei ist binär und es besteht die Möglichkeit, dass Sequenzen von CR, LF und CR LF beim Übertragen der Daten verfälscht werden. Wie NUL Charaktere behandelt werden, habe ich keine Ahnung.

Verwandte Themen