2010-05-29 21 views
17

Im tratando de descargar y guardar un archivo de una HttpWebResponse pero estoy teniendo problemas para guardar el archivo (que no sean archivos de texto) correctamente.C# guardar un archivo de una solicitud HTTP

Creo que es algo que ver con esta parte:

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

texto trabajo fino de archivos con el código anterior, pero cuando trato de guardar el contenido de un archivo de imagen se corrompe. ¿Cómo se escribe estos datos 'cadena' a un archivo de imagen (y otros archivos binarios)

se olvidó de mencionar, este es NET CP 3.5 y tengo una clase de contenedor alrededor de la clase HttpWebResponse añadir OAuth etc.

+1

Publique su código que realmente escribe en el archivo. Tal vez lo estás escribiendo en modo texto. Deberías escribirlo en modo binario. – Senthil

+0

@Senthil: No, es el código de lectura el que es problemático, y eso ya se ha demostrado. –

+0

Hmmm .. es el problema de la parte Encoding.UTF8.GetBytes()? – Senthil

Respuesta

44

El problema es que está interpretando los datos binarios como texto, incluso si no lo es - tan pronto como comienza a tratar el contenido como una cadena en lugar de bytes, tiene problemas. No ha proporcionado los detalles de su clase contenedora, pero asumo que su propiedad Content está devolviendo una cadena; no podrá usarla. Si su clase contenedora no le permite obtener los datos brutos de la respuesta web, tendrá que modificarlos.

Si está utilizando .NET 4, se puede utilizar el nuevo método CopyTo:

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

Si usted no está utilizando .NET 4, que tiene que hacer la copia manualmente:

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, pensé que ese era el problema. Se agregaron más detalles (.NET Compact 3.5) – dkarzon

+0

@ d1k_is: El segundo fragmento debería funcionar bien en el marco compacto (aparte de posiblemente cambiar la secuencia de salida). –

+0

Sí, ese era el problema. Así que tuve que modificar el contenedor httpresponse para que lea la transmisión a un archivo en lugar de solo a la propiedad Cadena de contenido. ¡Gracias! – dkarzon