2011-01-28 12 views
5

Napisałem następujący kod, aby pobrać zawartość ze strony internetowej i zapisać w systemie. jeśli strona jest w formacie html, mogę ją zapisać. jeśli strona jest w formacie pdf, nie mogę jej zapisać. Po zapisaniu, jeśli otworzę plik, nadchodzą puste strony.za pomocą odpowiedzi http, jak zapisać pliki pdf

Chcę wiedzieć Jak zapisać pliki PDF z odpowiedzi.

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(); 

Proszę mi pomóc JAK NAJSZYBCIEJ.

Odpowiedz

13

StreamReader.ReadToEnd() zwraca ciąg znaków. Pliki PDF są binarne i zawierają dane, które nie są przyjazne ciągom znaków. Musisz go przeczytać w tablicy bajtów i napisać tablicę bajtów na dysk. Co więcej, użyj tablicy mniejszych bajtów jako bufora i przeczytaj w małych porcjach.

Można również uprościć całość tylko przy użyciu WebClient: Pliki

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

PDF są _usually_ binarny, prawda? Ponieważ jest on oparty na [PostScript] (http://en.wikipedia.org/wiki/Portable_Document_Format#PostScript), może to być po prostu tekst, jak sądzę. –

+0

Dzięki Joelowi działa dobrze. – Vishnu

+0

Wspaniała metoda. :) +1 po roku. –

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); 
    } 
} 
Powiązane problemy