2010-05-29 3 views
17

Ich versuche, eine Datei von einer HttpWebResponse herunterzuladen und zu speichern, aber ich habe Probleme beim Speichern der Datei (außer Textdateien) richtig.C# speichern Sie eine Datei von einer HTTP-Anfrage

denke ich, es ist etwas mit diesem Teil zu tun:

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

Textdateien funktionieren mit dem obigen Code, aber wenn ich versuche, den Inhalt zu einem Bild zu speichern Datei, die es beschädigt wird. Wie kann ich die ‚string‘ Daten in eine Bilddatei zu schreiben (und andere binäre Dateien)

vergessen zu erwähnen, Dies ist .NET CP 3.5 und ich habe eine Wrapper-Klasse um die Klasse HttpWebResponse OAuth usw.

hinzufügen
+1

Bitte schreiben Sie Ihren Code, der tatsächlich in die Datei schreibt. Vielleicht schreibst du es im Textmodus. Sie sollten es im Binärmodus schreiben. – Senthil

+0

@Senthil: Nein, es ist der Lesecode, der problematisch ist - und das wurde bereits gezeigt. –

+0

Hmmm .. ist das Problem der Encoding.UTF8.GetBytes() Teil? – Senthil

Antwort

44

Das Problem ist, dass Sie die binären Daten als Text interpretieren, auch wenn dies nicht der Fall ist - sobald Sie anfangen, den Inhalt als Zeichenfolge anstelle von Bytes zu behandeln, sind Sie in Schwierigkeiten. Sie haben die Details Ihrer Wrapper-Klasse nicht angegeben, aber ich nehme an, dass Ihre Content -Eigenschaft eine Zeichenfolge zurückgibt - Sie können diese nicht verwenden. Wenn Ihre Wrapper-Klasse es nicht ermöglicht, die Rohdaten aus der Web-Antwort abzurufen, müssen Sie sie ändern.

Wenn Sie mit .NET 4, können Sie die neue CopyTo-Methode verwenden:

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

Wenn Sie nicht .NET 4 verwenden, müssen Sie manuell das Kopieren tun:

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); 
    } 
} 
+0

Yeh ich dachte, das war das Problem. Weitere Details hinzugefügt (.NET Compact 3.5) – dkarzon

+0

@ d1k_is: Das zweite Snippet sollte in dem kompakten Framework funktionieren (außer möglicherweise Ihren Ausgabestream ändern). –

+0

Ja, das war das Problem. Also musste ich den httpresponse-Wrapper modifizieren, damit er den Stream in eine Datei liest und nicht nur in die Content-String-Eigenschaft. Vielen Dank! – dkarzon

Verwandte Themen