主な機能は以下のとおりです。
- クリックするとFileプロパティにセットされたファイルをダウンロードする
- FileプロパティはClickイベントやDownloadingイベントでセットすることもできる
- Downloadedイベントで動的に作成したファイルを削除することもできる
使用するには、以下の手順に従います。
- FileDownloadButtonをプロジェクトに追加する
- FileDownloadButtonをツールボックスへ追加する
参考: 方法 : Visual Studio でカスタム ASP.NET サーバー コントロールを使用するの「カスタム コントロールをツールボックスに追加するには」 - *.aspxへFileDownloadButtonを配置し、イベントハンドラを設定する
例:<cc1:FileDownloadButton ID="FileDownloadButton1" runat="server" Text="Download" OnDownloading="FileDownloadButton1_Downloading" OnDownloaded="FileDownloadButton1_Downloaded"/>
- *.csでイベントハンドラを実装する
例:protected void FileDownloadButton1_Downloading(object sender, EventArgs e) { // Tempファイルを作成する var path = Path.GetTempFileName(); var file = new FileInfo(path); // Tempファイルへデータを出力する using (var s = file.OpenWrite()) using (var w = new StreamWriter(s)) { w.WriteLine("Hello"); w.Flush(); } // FileDownloadButtonのFileプロパティへTempファイルをセットする FileDownloadButton1.File = file; } protected void FileDownloadButton1_Downloaded(object sender, EventArgs e) { // Tempファイルを削除する FileDownloadButton1.File.Delete(); }
Content-Typeの設定やレスポンスの呼び出しなど、低レベルな処理をカプセル化できるので、導入のメリットはそこそこあると思います。よろしければご利用ください。
以下、FileDownloadButtonのソースです。
using System; using System.ComponentModel; using System.IO; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { /// <summary> /// ファイルをダウンロードするボタン /// <para>m.yamamo0417@gmail.com</para> /// </summary> [DefaultProperty("Text")] [ToolboxData("<{0}:FileDownloadButton runat=server></{0}:FileDownloadButton>")] public class FileDownloadButton : Button { /// <summary> /// Content-Type /// </summary> public const string ContentType = "application/octet-stream"; private event EventHandler downloading; private event EventHandler downloaded; /// <summary> /// ダウンロード対象のファイル /// </summary> public FileInfo File { get; set; } /// <summary> /// ダウンロード開始前に発生するイベント /// </summary> [Browsable(true)] public event EventHandler Downloading { add { downloading += value; } remove { downloading -= value; } } /// <summary> /// ダウンロード終了後に発生するイベント /// </summary> [Browsable(true)] public event EventHandler Downloaded { add { downloaded += value; } remove { downloaded -= value; } } /// <summary> /// コンストラクタ /// <para>デフォルトのイベントハンドラをセット</para> /// </summary> public FileDownloadButton() : base() { downloading += (sender, e) => { }; downloaded += (sender, e) => { }; } protected override void OnClick(EventArgs e) { // Clickイベントを発生させる base.OnClick(e); // Downloadingイベントを発生させる OnDownloading(e); // FileがnullのときはNullReferenceExceptionをthrowする if (File == null) { throw new NullReferenceException("Fileプロパティがnullです。"); } // Fileが存在しないときはFileNotFoundExceptionをthrowする if (!File.Exists) { throw new FileNotFoundException("ファイルが見つかりません。", File.FullName); } // Content-Typeを設定 Page.Response.ContentType = ContentType; // レスポンスへファイルの内容を出力する Page.Response.Clear(); Page.Response.WriteFile(File.FullName); Page.Response.Flush(); Page.Response.End(); // Downloadedイベントを発生させる OnDownloaded(e); } /// <summary> /// Downloadingイベントを発生させる /// </summary> /// <param name="e">イベントオブジェクト</param> protected virtual void OnDownloading(EventArgs e) { downloading(this, e); } /// <summary> /// Downloadedイベントを発生させる /// </summary> /// <param name="e">イベントオブジェクト</param> protected virtual void OnDownloaded(EventArgs e) { downloaded(this, e); } } }
0 件のコメント:
コメントを投稿