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