データを応答ストリームにダンプするときにファイル名を指定するにはどうすればよいですか?
現在、私は次のことをしています:
byte[] data= GetFoo();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.BinaryWrite(data);
Response.End();
上記のコードでは、保存するファイル名として「foo.aspx.pdf」を取得しています。保存するファイル名を指定するために応答にヘッダーを追加できることを覚えているようです。
ヘッダーにcontent-dispositionを追加します。
Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf""");
参考:「添付」ではなく「インライン」を使用すると、ファイルはIEで自動的に開きます。開く/保存ダイアログでユーザーにプロンプトを出す代わりに。
Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName));
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf");
何らかの理由で、そこにあるほとんどの回答は、ファイル名の値をエンコードすることすらしていません。ファイルにスペース、セミコロン、引用符が含まれている場合、正しく認識されない可能性があります。
ContentDisposition
クラスを使用して正しいヘッダー値を生成できるようです:
_Response.AppendHeader("Content-Disposition", new ContentDisposition
{
FileName = yourFilename
}.ToString());
_
ContentDisposition.ToString()
のソースコードをチェックアウトして、適切にエンコードしようとしていることを確認できます。
警告:これは、ファイル名にハイフンではなくダッシュが含まれているとクラッシュするようです。これについてはまだ調べていません。
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";")