以前の答えは正しいです:行を追加します...
Response.AddHeader("Content-Disposition", "inline; filename=[filename]");
...複数のContent-Dispositionヘッダーがブラウザに送信されます。これは、ファイル名を指定した場合、b/cFileContentResult
がヘッダーを内部的に適用する場合に発生します。別の非常に単純な解決策は、のサブクラスを作成し、そのメソッドFileContentResult
をオーバーライドすることです。クラスのインスタンス(内部実装で使用されているのと同じオブジェクト)をインスタンス化し、それを新しいクラスに渡すExecuteResult()
例を次に示します。System.Net.Mime.ContentDisposition
FileContentResult
public class FileContentResultWithContentDisposition : FileContentResult
{
private const string ContentDispositionHeaderName = "Content-Disposition";
public FileContentResultWithContentDisposition(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
: base(fileContents, contentType)
{
// check for null or invalid ctor arguments
ContentDisposition = contentDisposition;
}
public ContentDisposition ContentDisposition { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
// check for null or invalid method argument
ContentDisposition.FileName = ContentDisposition.FileName ?? FileDownloadName;
var response = context.HttpContext.Response;
response.ContentType = ContentType;
response.AddHeader(ContentDispositionHeaderName, ContentDisposition.ToString());
WriteFile(response);
}
}
、Controller
またはベースController
で、をインスタンス化する簡単なヘルパーを記述し、 FileContentResultWithContentDisposition
次のようにアクションメソッドから呼び出すことができます。
protected virtual FileContentResult File(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
{
var result = new FileContentResultWithContentDisposition(fileContents, contentType, contentDisposition);
return result;
}
public ActionResult Report()
{
// get a reference to your document or file
// in this example the report exposes properties for
// the byte[] data and content-type of the document
var report = ...
return File(report.Data, report.ContentType, new ContentDisposition {
Inline = true,
FileName = report.FileName
});
}
これで、ファイルは、選択したファイル名と「inline; filename=[filename]」のcontent-dispositionヘッダーでブラウザに送信されます。
お役に立てば幸いです。