目次

ファイルをダウンロードするジェネリック ハンドラーを作成する (ダウンロードダイアログのデフォルトファイル名を日本語のファイル名にする) - ASP.NET

ファイルをダウンロードさせるジェネリック ハンドラーを作成します。
ASP.NETでファイルをダウンロードさせる場合にはContent-TypeとContent-Dispositionを設定する必要があります。詳しくはこちらの記事を参照してください。Content-Dispositionのfilenameパラメーターに日本語ファイル名を指定する場合は、URLエンコードしたファイル名を指定する必要があります。

コード例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SimpleGenericHandler
{
  /// <summary>
  /// SimpleHandler の概要の説明
  /// </summary>
  public class SimpleHandler : IHttpHandler
  {

    public void ProcessRequest(HttpContext context)
    {
      string figID="日本語ファイル名";
      string filename = HttpUtility.UrlEncode(figID);

      context.Response.ContentType = "application/octet-stream";
      context.Response.AppendHeader(
        "Content-Disposition", string.Format("attachment; filename={0:s}.dat", filename));

      string data="abcd";
      byte[] databytes = System.Text.Encoding.GetEncoding("shift-JIS").GetBytes(data);

      context.Response.OutputStream.Write(databytes, 0, databytes.Length);
    }

    public bool IsReusable
    {
      get
      {
        return false;
      }
    }
  }
}

解説

下記のコードでダウンロードするファイルにデフォルトで設定する日本語のファイル名をURLエンコードします。
 string figID="日本語ファイル名";
 string filename = HttpUtility.UrlEncode(figID);

下記のコードにて、レスポンスのContentTypeとContent-Dispositionパラメータを設定します。Content-Dispositionレスポンスヘッダーの attachment; filename= の値にダウンロードするファイルのデフォルトのファイル名を設定します。
 context.Response.ContentType = "application/octet-stream";
 context.Response.AppendHeader(
   "Content-Disposition", string.Format("attachment; filename={0:s}.dat", filename));

下記コードが、ダウンロードさせるデータ送信するコードです。今回の例では、"abcd"の文字列をShift-JISでエンコードしたものをダウンロードされるファイルとして送信します。
 string data="abcd";
 byte[] databytes = System.Text.Encoding.GetEncoding("shift-JIS").GetBytes(data);
 context.Response.OutputStream.Write(databytes, 0, databytes.Length);

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2010-12-15
iPentec all rights reserverd.