2011-01-22 10 views
13

que utilizar HTTP GET que descarga un archivo zip en un navegador, algo así como https://example.com/up/DBID/a/rRID/eFID/vVID (no la URL exacta)¿Cómo descargo el archivo zip en C#?

Ahora, cuando trato de hacer lo mismo descarga de código C# (el mismo método GET como arriba) para una aplicación de escritorio, el archivo comprimido descargado no es un archivo válido. Cuando abrí este archivo en el bloc de notas, era una página HTML.

Creo que no estoy estableciendo un encabezado correctamente. Miré a mi alrededor en busca de ejemplos. Encontré varias cargas de wrt, pero no vi nada para descargar.

Código:

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

Se trata de una inimaginable 'no funciona' cuestión. Código postal, documente lo que ve cuando abre el archivo en un visor hexadecimal. –

Respuesta

37

Es sobre todo porque se utiliza un StreamWriter : TextWriter para manejar un archivo Zip binario. Un StreamWriter espera texto y aplicará una Codificación. E incluso el codificador ASCII simple podría tratar de "arreglar" lo que cree que son terminaciones de línea no válidas.

Puede reemplazar todo el código con:

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

Oh sí, puedo ver el mismo problema allí. –

+0

+1 me gané - @Al: Probé esto con un archivo zip y funciona muy bien, ¿estás seguro de que el archivo ya no está dañado? – BrokenGlass

+0

WebClient también creó el mismo tipo de archivo zip. – Merrin

7

Se podía utilizar para una WebClient 2-liner:

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

Corto y simple. Me gusta ese tipo de programación. +1 para usted –

+1

@anvarbekraupov: Estoy usando una declaración 'using' - busque más difícil – BrokenGlass

+0

@BrokenGlass, reemplazó mi versión anterior con +1, ¡disculpas! –

Cuestiones relacionadas