C#

ダウンロードファイル名を指定する方法

通常Responseにファイル内容を書き込むとContentTypeによってはクライアントでダウンロードのダイアログが出る。このときの「ファイル名」を変更する方法です。

    Response.ContentType = "application/msword";
    Response.AppendHeader("content-disposition", "inline; filename=sample.doc");
    Response.OutputStream.Write(Buffer, 0, Buffere.Length);
    Response.End();

ContentTypeは適切に変更する必要があります。これによってダウンロードのダイアログが出るかどうかが変わります。

次のAppendHeaderで応答ヘッダにcontent-dispositionという項目を追加し、そこでファイル名を指定します。例では「sample.doc」というファイル名が提示されるはずです。

※AddHeaderは古い形式のメソッドです。

追記:その後、試行錯誤を繰り返して日本語ファイル名を使うにはファイル名部分(上の例では"sample.doc"のところ)をServer.UrlEncodeでエンコードすれば良いことがわかりました。

    string FileName = Server.UrlEncode("さんぷる.doc");
    Response.AppendHeader("content-disposition", "inline; filename=" + FileName);

追記2:LINUXでこの処理を扱う機会があったのですが、シフトJISコードで日本語ファイル名をそのまま指定しても良いようです。C#はUNICODEなのでそのままでは渡せないということなのでしょう。

メモ

    disposition := "Content-Disposition" ":" disposition-type *(";" disposition-parm)

    disposition-type := "inline" / "attachment" / extension-token

    disposition-parm := filename-parm / creation-date-parm / modification-date-parm / read-date-parm / size-parm / parameter

    filename-parm := "filename" "=" value

    creation-date-parm := "creation-date" "=" quoted-date-time

    modification-date-parm := "modification-date" "=" quoted-date-time

    read-date-parm := "read-date" "=" quoted-date-time

    size-parm := "size" "=" 1*DIGIT

    quoted-date-time := quoted-string