HTTPで画像やファイルをダウンロードしてファイルに保存する (HttpWebRequestクラスを利用) - C#

HttpWebRequestを利用してWebから画像やファイルをダウンロードしてファイルに保存するコードを紹介します。

概要

こちらの記事ではWebClientを利用したファイルダウンロードのコードを紹介しましたが、ダウンロード時にUserAgentを指定したい場合やReferrerを指定したい場合はWebClientでは対応できません。ReferrerやUserAgentを設定してファイルをダウンロードする場合はこの記事で紹介するHttpWebRequestを用います。

UI

下図のUIを準備します。実際に利用するのはbutton2とTextBoxです。

コード

下記のコードを記述します。Button2のClickイベントを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;

namespace GetImageFromTwitter
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      try
      {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://(画像ファイルのURL)");
        req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)";
        req.Referer = "http://www.ipentec.com/index.html";

        WebResponse res = req.GetResponse();
        Stream st = res.GetResponseStream();

        byte[] buffer = new byte[65535];
        MemoryStream ms = new MemoryStream();
        while (true)
        {
          int rb = st.Read(buffer, 0, buffer.Length);
          if (rb > 0)
          {
            ms.Write(buffer, 0, rb);
          }
          else
          {
            break;
          }
        }

        FileStream fs = new FileStream("img.jpg", FileMode.Create);
        byte[] wbuf = new byte[ms.Length];
        ms.Seek(0, SeekOrigin.Begin);
        ms.Read(wbuf, 0, wbuf.Length);
        fs.Write(wbuf, 0, wbuf.Length);
        fs.Close();

        textBox1.Text += "ファイルを保存しました。\r\n";
      }
      catch (WebException exc)
      {
        textBox1.Text += exc.Message + "\r\n";
      }
    }
  }
}

解説

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://(画像ファイルのURL)");
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)";
req.Referer = "http://tr.twipple.jp/p/89/441963.html";
HttpWebRequestインスタンスの作成をします。インスタンスの作成はHttpWebRequestのnewでなはく、WebRequest.Createメソッドを利用します。インスタンス作成後、UserAgentプロパティ、Referrerプロパティに値を設定します。

WebResponse res = req.GetResponse();
Stream st = res.GetResponseStream();
HttpWebRequest.GetResponse()メソッドを呼び出し、ファイルをダウンロードします。サーバーからのレスポンスを取得するストリームをHttpWebRequest.GetResponseStreamを用いて取得します。

byte[] buffer = new byte[65535];
MemoryStream ms = new MemoryStream();
while (true)
{
  int rb = st.Read(buffer, 0, buffer.Length);
  if (rb > 0){
    ms.Write(buffer, 0, rb);
  }
  else{
    break;
  }
}
HttpWebRequest.GetResponseStreamを用いて取得したストリームからデータを読み出しメモリストリームに保存します。ネットワークのストリームは現在位置の概念がないことや、いつデータの取得が完了するかわからないため、Lengthなどの値を持たない(シークをサポートしていない)ため、読み取ったデータをメモリストリーム(MemoryStream)に格納します。

FileStream fs = new FileStream("img.jpg", FileMode.Create);
byte[] wbuf = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(wbuf, 0, wbuf.Length);
fs.Write(wbuf, 0, wbuf.Length);
fs.Close();

textBox1.Text += "ファイルを保存しました。\r\n";
ファイルストリームを作成し、HttpWebRequestで取得したレスポンス結果を格納したMemoryStreamの内容をファイルに書き込みます。

実行結果

プロジェクトを実行し、ウィンドウが表示された後、Button2をクリックします。指定したURLのファイルがダウンロードされ、実行ファイルのあるディレクトリに"img.jpg"として保存されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-11-17
作成日: 2012-10-24
iPentec all rights reserverd.