2011-01-28 38 views
5

He escrito el siguiente código para obtener el contenido de una página web y guardarlo en el sistema. si la página web está en formato html, puedo guardarla. si la página web está en formato pdf, no puedo guardarla. Después de guardar si abro el archivo, aparecerán páginas en blanco.usando la respuesta http cómo guardar los archivos pdf

Quiero saber cómo guardar los archivos pdf de la respuesta.

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
WebResponse response = request.GetResponse(); 
Stream stream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(stream); 
webContent = reader.ReadToEnd(); 
StreamWriter sw = new StreamWriter(FileName); 
sw.WriteLine(webContent); 
sw.Close(); 

Por favor, ayúdenme lo antes posible.

Respuesta

13

StreamReader.ReadToEnd() devuelve una cadena. Los archivos PDF son binarios y contienen datos que no admiten cadenas. Necesita leerlo en una matriz de bytes y escribir la matriz de bytes en el disco. Mejor aún, utilice una matriz de bytes más pequeña como un búfer y lea en pequeños fragmentos.

También puede simplificar todo esto sólo por el uso webclient: archivos

using (var wc = new System.Net.WebClient()) 
{ 
    wc.DownloadFile(Url, FileName); 
} 
+0

PDF son binarios _usually_, ¿verdad? Como se basa en [PostScript] (http://en.wikipedia.org/wiki/Portable_Document_Format#PostScript), puede ser solo texto, también, supongo. –

+0

Gracias Joel está funcionando bien. – Vishnu

+0

Método fabuloso. :) +1 después de un año. –

6
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
WebResponse response = request.GetResponse(); 

using (Stream stream = response.GetResponseStream()) 
using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    stream.BlockCopy(fs); 
} 

... 
public static class StreamHelper 
{ 
    public static void Copy(Stream source, Stream target, int blockSize) 
    { 
     int read; 
     byte[] buffer = new byte[blockSize]; 
     while ((read = source.Read(buffer, 0, blockSize)) > 0) 
     { 
      target.Write(buffer, 0, read); 
     } 
    } 
    public static void BlockCopy(this Stream source, Stream target, int blockSize = 65536) 
    { 
     Copy(source, target, blockSize); 
    } 
} 
Cuestiones relacionadas