web-dev-qa-db-ja.com

WebRequestsを使用してPDFファイルをダウンロードする

URLのリストを自動的に指定して多数のPDFファイルをダウンロードしようとしています。

これが私が持っているコードです:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

request.Method = "GET";

var encoding = new UTF8Encoding();

request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb,en;q=0.5");
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");

request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";

HttpWebResponse resp = (HttpWebResponse)request.GetResponse();

BinaryReader reader = new BinaryReader(resp.GetResponseStream());

FileStream stream = new FileStream("output/" + date.ToString("yyyy-MM-dd") + ".pdf",FileMode.Create);

BinaryWriter writer = new BinaryWriter(stream);

while (reader.PeekChar() != -1)
      {
       writer.Write(reader.Read());
      }
       writer.Flush();
       writer.Close();

だから、私は最初の部分が機能することを知っています。私はもともとそれを取得してTextReaderを使用して読んでいましたが、それによって破損したpdfファイルが生成されました(pdfはバイナリファイルであるため)。

今それを実行すると、reader.PeekChar()は常に-1であり、何も起こりません-空のファイルを取得します。

デバッグ中に、reader.Read()を呼び出したときに実際には異なる番号が付けられていることに気付きました。そのため、Peekが壊れている可能性があります。

だから私は非常に汚いものを試しました

try
{
 while (true)
   {
    writer.Write(reader.Read());
    }
 }
   catch
      {
      }
 writer.Flush();
 writer.Close();

今、私はいくつかのゴミが入った非常に小さなファイルを取得していますが、それでも私が探しているものではありません。

だから、誰でも私を正しい方向に向けることができますか?

追加情報:

ヘッダーは、圧縮されたものなどを示唆していません。

HTTP/1.1 200 OK
Content-Type: application/pdf
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Fri, 10 Aug 2012 11:15:48 GMT
Content-Length: 109809
11
Aabela

BinaryReaderBinaryWriterをスキップし、入力ストリームを出力FileStreamにコピーするだけです。簡単に

var fileName = "output/" + date.ToString("yyyy-MM-dd") + ".pdf";
using (var stream = File.Create(fileName))
  resp.GetResponseStream().CopyTo(stream);
18

WebClientクラスを使用してみませんか?

using (WebClient webClient = new WebClient())
{
    webClient.DownloadFile("url", "filePath");
}
10
Sergey Brunov

あなたの質問はWebClientについて尋ねますが、あなたのコードはRaw HTTP Requests&Resposnsesを使用していることを示しています。

実際に使ってみませんか System.Net.WebClient

using(System.Net.WebClient wc = new WebClient()) 
{
    wc.DownloadFile("http://www.site.com/file.pdf",  "C:\\Temp\\File.pdf");
}
2
Eoin Campbell

private void Form1_Load(object sender、EventArgs e){

        WebClient webClient = new WebClient();
        webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
        webClient.DownloadFileAsync(new Uri("https://www.colorado.gov/pacific/sites/default/files/Income1.pdf"), @"output/" + DateTime.Now.Ticks ("")+ ".pdf", FileMode.Create);
      }

    private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        progressBar = e.ProgressPercentage;
    }

    private void Completed(object sender, AsyncCompletedEventArgs e)
    {
        MessageBox.Show("Download completed!");
    }
}

}