[C#] WebBrowserでのファイルダウンロード方法

C#のWebBrowserコントロールは、Webページの表示や簡単なブラウジング機能を提供しますが、ファイルのダウンロードを直接サポートしていません。

ファイルをダウンロードするには、WebBrowserNavigatingイベントを利用して、ダウンロードリンクを検出し、WebClientHttpClientクラスを使ってファイルをダウンロードする方法があります。

NavigatingイベントでリンクのURLを取得し、そのURLをWebClientDownloadFileメソッドに渡すことで、指定したパスにファイルを保存できます。

これにより、WebBrowserでのファイルダウンロードを実現できます。

この記事でわかること
  • WebBrowserコントロールの活用法
  • WebClientを使ったファイルダウンロード
  • HttpClientによる非同期処理
  • ダウンロードの進捗表示方法
  • 複数ファイルの一括ダウンロード方法

目次から探す

WebBrowserでのファイルダウンロード方法

Navigatingイベントの活用

WebBrowserコントロールのNavigatingイベントを利用することで、ユーザーがリンクをクリックした際にファイルをダウンロードする処理を実装できます。

以下は、Navigatingイベントを使用してファイルをダウンロードするサンプルコードです。

using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        webBrowser1.Navigating += WebBrowser1_Navigating; // Navigatingイベントの登録
		webBrowser1.Navigate("https://google.com"); // Googleのページをダウンロードする
    }
    private void WebBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        // ダウンロードするURLを取得
        string url = e.Url.ToString();
        
        // WebClientを使用してファイルをダウンロード
        using (WebClient webClient = new WebClient())
        {
            webClient.DownloadFile(url, "ダウンロードしたファイル名.html"); // ファイル名を指定
        }
        
        e.Cancel = true; // WebBrowserのナビゲーションをキャンセル
    }
}

このコードでは、WebBrowserコントロールがリンクをクリックした際に、指定したURLからファイルをダウンロードします。

ダウンロードが完了した後、WebBrowserのナビゲーションはキャンセルされます。

WebClientクラスを使ったダウンロード

WebClientクラスを使用することで、簡単にファイルをダウンロードできます。

以下は、WebClientを使ったファイルダウンロードのサンプルコードです。

using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void DownloadFile(string url, string fileName)
    {
        using (WebClient webClient = new WebClient())
        {
            webClient.DownloadFile(url, fileName); // 指定したURLからファイルをダウンロード
        }
    }
}

このメソッドを呼び出すことで、指定したURLからファイルをダウンロードし、指定したファイル名で保存します。

HttpClientクラスを使ったダウンロード

HttpClientクラスは、非同期処理を行うためのクラスで、ファイルのダウンロードにも利用できます。

以下は、HttpClientを使ったファイルダウンロードのサンプルコードです。

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private async Task DownloadFileAsync(string url, string fileName)
    {
        using (HttpClient httpClient = new HttpClient())
        {
            var response = await httpClient.GetAsync(url); // URLからデータを取得
            response.EnsureSuccessStatusCode(); // ステータスコードが成功であることを確認
            
            var content = await response.Content.ReadAsByteArrayAsync(); // バイト配列として取得
            System.IO.File.WriteAllBytes(fileName, content); // ファイルに書き込む
        }
    }
}

このメソッドは非同期で動作し、指定したURLからファイルをダウンロードして指定したファイル名で保存します。

非同期処理を使用することで、UIがフリーズすることを防ぎます。

ダウンロードの進捗表示

ファイルのダウンロード中に進捗を表示することも可能です。

WebClientクラスを使用した場合、DownloadProgressChangedイベントを利用して進捗を表示できます。

以下はそのサンプルコードです。

using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void DownloadFile(string url, string fileName)
    {
        using (WebClient webClient = new WebClient())
        {
            webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged; // 進捗イベントの登録
            webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted; // 完了イベントの登録
            webClient.DownloadFileAsync(new Uri(url), fileName); // 非同期でダウンロード開始
        }
    }
    private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        // 進捗を表示
        progressBar1.Value = e.ProgressPercentage; // プログレスバーに進捗を設定
    }
    private void WebClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        // ダウンロード完了時の処理
        MessageBox.Show("ダウンロードが完了しました!"); // メッセージボックスで通知
    }
}

このコードでは、ダウンロードの進捗をプログレスバーに表示し、ダウンロードが完了した際にメッセージボックスで通知します。

非同期でダウンロードを行うため、UIがスムーズに動作します。

応用例

ダウンロードの自動化

ダウンロードの自動化を行うことで、特定のURLから定期的にファイルをダウンロードすることができます。

以下は、指定したURLから自動的にファイルをダウンロードするサンプルコードです。

using System;
using System.Windows.Forms;
using System.Net;
using System.Timers;
public partial class MyForm : Form
{
    private Timer timer; // タイマーの宣言
    public MyForm()
    {
        InitializeComponent();
        timer = new Timer(60000); // 1分ごとにダウンロード
        timer.Elapsed += Timer_Elapsed; // タイマーのイベント登録
        timer.Start(); // タイマー開始
    }
    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        DownloadFile("http://example.com/file.ext", "自動ダウンロードファイル.ext"); // 自動ダウンロード
    }
    private void DownloadFile(string url, string fileName)
    {
        using (WebClient webClient = new WebClient())
        {
            webClient.DownloadFile(url, fileName); // 指定したURLからファイルをダウンロード
        }
    }
}

このコードでは、1分ごとに指定したURLからファイルを自動的にダウンロードします。

タイマーを使用することで、定期的な処理が可能になります。

複数ファイルの一括ダウンロード

複数のファイルを一括でダウンロードする場合、URLのリストを用意し、ループ処理を使ってダウンロードを行います。

以下はそのサンプルコードです。

using System;
using System.Windows.Forms;
using System.Net;
using System.Collections.Generic;
public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void DownloadFiles(List<string> urls)
    {
        foreach (var url in urls) // URLリストをループ
        {
            string fileName = System.IO.Path.GetFileName(url); // ファイル名を取得
            using (WebClient webClient = new WebClient())
            {
                webClient.DownloadFile(url, fileName); // 各URLからファイルをダウンロード
            }
        }
    }
}

このメソッドを呼び出すことで、指定したURLリストからファイルを一括でダウンロードできます。

ダウンロード完了後の処理

ダウンロードが完了した後に特定の処理を行うことも可能です。

以下は、ダウンロード完了後にファイルの移動を行うサンプルコードです。

using System;
using System.Windows.Forms;
using System.Net;
using System.IO;
public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void DownloadFile(string url, string fileName)
    {
        using (WebClient webClient = new WebClient())
        {
            webClient.DownloadFile(url, fileName); // ファイルをダウンロード
            MoveFile(fileName, "移動先フォルダ/" + Path.GetFileName(fileName)); // ダウンロード後にファイルを移動
        }
    }
    private void MoveFile(string sourceFile, string destFile)
    {
        File.Move(sourceFile, destFile); // ファイルを移動
    }
}

このコードでは、ファイルのダウンロードが完了した後に、指定したフォルダにファイルを移動します。

ダウンロードのキャンセル機能

ダウンロード中にユーザーがキャンセルできる機能を実装することも可能です。

以下は、ダウンロードをキャンセルするためのサンプルコードです。

using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
    private WebClient webClient; // WebClientの宣言
    public MyForm()
    {
        InitializeComponent();
    }
    private void StartDownload(string url, string fileName)
    {
        webClient = new WebClient();
        webClient.DownloadFileAsync(new Uri(url), fileName); // 非同期でダウンロード開始
    }
    private void CancelDownload()
    {
        if (webClient != null && webClient.IsBusy) // ダウンロード中か確認
        {
            webClient.CancelAsync(); // ダウンロードをキャンセル
        }
    }
}

このコードでは、ダウンロード中にキャンセルボタンを押すことで、ダウンロードを中止することができます。

CancelAsyncメソッドを使用することで、非同期ダウンロードをキャンセルできます。

よくある質問

WebBrowserでダウンロードが開始されないのはなぜ?

WebBrowserコントロールでダウンロードが開始されない場合、以下のような原因が考えられます。

  • Navigatingイベントの未設定: WebBrowserのNavigatingイベントが正しく設定されていないと、ダウンロード処理が実行されません。
  • URLの不正: ダウンロードしようとしているURLが無効または存在しない場合、ダウンロードは開始されません。
  • セキュリティ設定: アプリケーションのセキュリティ設定や、WebBrowserコントロールのセキュリティポリシーが影響している可能性があります。

ダウンロード中にアプリケーションがフリーズするのを防ぐには?

ダウンロード中にアプリケーションがフリーズするのを防ぐためには、非同期処理を利用することが重要です。

以下の方法があります。

  • WebClientの非同期メソッドを使用: DownloadFileAsyncメソッドを使用することで、UIスレッドをブロックせずにダウンロードを行えます。
  • HttpClientの非同期メソッドを使用: GetAsyncメソッドを使用して、非同期でファイルをダウンロードすることができます。
  • バックグラウンドワーカーの利用: BackgroundWorkerを使用して、ダウンロード処理を別スレッドで実行することも可能です。

WebClientとHttpClientの違いは何ですか?

WebClientとHttpClientはどちらもHTTPリクエストを行うためのクラスですが、以下のような違いがあります。

  • 非同期処理: HttpClientは非同期処理を強くサポートしており、async/await構文を使用できます。

一方、WebClientも非同期メソッドを持っていますが、HttpClientの方がより柔軟です。

  • リソース管理: HttpClientは、リソースの管理がより効率的で、複数のリクエストを行う際に再利用が可能です。

WebClientは、リクエストごとに新しいインスタンスを作成することが一般的です。

  • 機能の豊富さ: HttpClientは、HTTPヘッダーの設定や、リクエストのカスタマイズが容易で、より多機能です。

WebClientはシンプルなダウンロードやアップロードに適しています。

まとめ

この記事では、C#のWebBrowserコントロールを使用したファイルダウンロードの方法について詳しく解説しました。

具体的には、Navigatingイベントの活用やWebClient、HttpClientを用いたダウンロード手法、さらにはダウンロードの進捗表示や自動化、複数ファイルの一括ダウンロードなどの応用例についても触れました。

これらの知識を活かして、実際のアプリケーションにファイルダウンロード機能を実装してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す