2011-01-22 2 views
13

utilizzare HTTP GET che scarica un file zip in un browser, qualcosa come https://example.com/up/DBID/a/rRID/eFID/vVID (non l'URL esatto)Come posso scaricare il file zip in C#?

Ora, quando cerco di fare lo stesso il download in codice C# (stesso metodo GET come sopra) per un applicazione desktop, il file zip scaricato non è un file di archivio valido. Quando ho aperto questo file nel blocco note, era una pagina HTML.

Penso di non impostare correttamente l'intestazione. Ho cercato degli esempi. Ho trovato diversi caricamenti di wrt, ma non ho visto nulla per i download.

Codice:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
request.ContentType = "application/zip"; 
try 
{ 
    HttpWebResponse res = (HttpWebResponse)request.GetResponse(); 
    using (StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default)) 
    { 
     StreamWriter oWriter = new StreamWriter(@"D:\Downloads\1.zip"); 
     oWriter.Write(sr.ReadToEnd()); 
     oWriter.Close(); 
    } 
    res.Close(); 
} 
catch (Exception ex) 
{ 
} 
+4

Questo è un unguessable 'non funziona' domanda. Inserisci il codice, documenta ciò che vedi quando apri il file in un visualizzatore esadecimale. –

risposta

37

E 'soprattutto perché si utilizza un StreamWriter : TextWriter per gestire un file Zip binario. Un StreamWriter si aspetta il testo e applicherà una codifica. E anche il semplice Encoder ASCII potrebbe provare a "sistemare" quelli che a suo avviso non sono terminazioni di riga non valide.

è possibile sostituire tutto il codice con:

using (var client = new WebClient()) 
    { 
    client.DownloadFile("http://something", @"D:\Downloads\1.zip"); 
    } 
+0

Oh sì, posso vedere lo stesso problema lì dentro. –

+0

+1 mi ha battuto - @Al: ho provato questo con un file zip e funziona bene, sei sicuro che il file stesso non sia già corrotto? – BrokenGlass

+0

WebClient ha anche creato lo stesso tipo di file zip. – Merrin

7

Si potrebbe utilizzare WebClient per un 2-liner:

using(WebClient wc = new WebClient()) 
{ 
    wc.DownloadFile(url, @"D:\Downloads\1.zip"); 
} 
+0

Breve e semplice. Mi piace quel tipo di programmazione. +1 per te –

+1

@anvarbekraupov: Sto usando un'istruzione 'using' - sembra più difficile – BrokenGlass

+0

@BrokenGlass, ho sostituito il mio downgrade con +1, scuse! –