2011-01-28 104 views
5

我已經編寫了以下代碼以從網頁獲取內容並保存到系統中。 如果網頁是html格式,我可以保存它。 如果網頁是pdf格式,我無法保存。保存後如果我打開文件空白頁即將到來。使用http響應如何保存pdf文件

我想知道如何從響應中保存pdf文件。

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

請儘快幫我。

回答

13

StreamReader.ReadToEnd()返回一個字符串。 PDF文件是二進制文件,幷包含不友好字符串的數據。您需要將它讀入一個字節數組,並將字節數組寫入磁盤。更好的是,使用較小的字節數組作爲緩衝區並以小塊讀取。

您還可以通過只使用Web客戶端簡化了整個事情:

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

PDF文件_usually_二進制的,不是嗎?由於它基於[PostScript](http://en.wikipedia.org/wiki/Portable_Document_Format#PostScript),它可以只是文字,我猜也是。 – 2011-01-28 05:47:23

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