C#

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

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

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

ContentTypeは適切に変更する必要があります。

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

content-dispositionが「inline」ならば、画像やPDFなど、ブラウザで表示できるものはブラウザ内に表示されます。意図してダウンロードのダイアログを表示させるには、「inline」ではなく「attachment」を指定します。

※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
(2018/10/17 更新)