asp.net core webappでのファイルダウンロード

以前にファイルアップロードの件でも少し書いたが、asp.net core webappでのファイルダウンロードについて、多分正解というのが分かったので・・・

結局、OnPostやOnGetをvoidで定義するのではなく、下記のようにActionResultを返すメソッドとして定義する。

public IActionResult OnPost(・・・) {
}

処理中でファイルをダウンロードさせたい場合は、File(・・・)を使用して、FileResultを返せば良い。また、ファイルダウンロードでは無く、画面表示をさせたい場合は、Page()を使用して、PageResultを返す。

// Excelファイルのダウンロード
try {
	using(xls = new ExcelPackage(new FileInfo(templatepath))) {
	    // セルに対して値の設定等の処理
    ・・・
		// ちなみに、ファイル名は自動的にurlencode化されるので、
		// 事前にUrlEncodeすると変なファイル名になる。
		// PageModel.Fileを使用して、FileResultを返す
	    return File(xls.GetAsByteArray(),"application/octet-stream",filename);
	}
} catch (Exception e) {
	Message = $"エラー発生{e.Message}";
	return Page();
}

なお、File(stream,・・・)を使用する場合、Streamに書き込み等を行っていた場合、ポジションを先頭に戻さないと、実行時エラーが起きるようだ。

Stream stm = MemoryStream();
// メモリストリームに書き込み
・・・
// ポジションを先頭に
stm.Seek(0L,SeekOrigin.Begin);
return File(stm,"application/octet-stream",filename);

やっぱり、基礎を覚えないとだめだね・・・

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, asp.net core, C#, dotnetcore, 技術系 パーマリンク

asp.net core webappでのファイルダウンロード への1件のコメント

  1. takezou のコメント:

    もちろん、

    public async Task Post(・・・)

    のように、非同期メソッドとして定義することも可能。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください