2011-01-28 21 views
5

Webページからコンテンツを取得してシステムに保存するために、次のコードを記述しました。 ウェブページがhtml形式の場合、保存できます。 Webページが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)に基づいているので、テキストだけでもかまいません。 –

+0

ジョエルはうまく働いてくれてありがとう。 – Vishnu

+0

素晴らしい方法。 :) 1年後に+1。 –

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); 
    } 
} 
関連する問題