28

ActionResultはを返しますが、File条件付きでを返すためにも必要Streamです。

ActionResultを返す方法に関するドキュメントを見つけることができませんでしたStream

これがファイルを返すための私のコードです:

    return File(memoryStream,.... )

前述のように、私はただを返す必要がありStreamます。

4

3 に答える 3

44

MVC5 2020用に更新:

私の以前の答えは日付が付けられました。

現在のところ、File異なるタイプのActionResultが返されるのは、指定された引数によって異なります。

// to return FileStreamResult
return File(memoryStream, "application/pdf");
// or..
return File(memoryStream, "application/pdf", "file_name");

使用FileStreamResult

MemoryStream stream = someService.GetStream();

return new FileStreamResult(stream, "application/pdf")
于 2012-12-21T04:14:39.537 に答える
9

アクションに別のアクションを呼び出すことは、デザインの匂いです。あなたはそれを避けるべきです。単純に、再利用する必要のあるロジックをサービスレイヤーの2つのアクションの間に配置します。次に、2つのアクションからこのロジックを呼び出します。

例えば:

public ActionResult Action1()
{
    Stream stream = service.GetStream();
    // ... do something with the stream and return a view for example
    return View();
}

public ActionResult Action2()
{
    Stream stream = service.GetStream();
    // let's return the stream to the client so that he could download it as file
    return File(stream, "application/pdf");
}

これで、最初のアクションから2番目のアクションを呼び出す必要がなくなりました。

于 2012-12-21T06:38:01.577 に答える
8

Streamaのアクションメソッドの結果としてaを使用する最短の方法Controllerは、質問ですでに示した方法です。のFileヘルパーメソッドを使用しControllerます。これはを返しますFileStreamResult

をとる利用可能なオーバーロードがいくつかありますStream。どちらのオーバーロードでも、応答のMIMEタイプを指定する必要があります。これはContent-Type、応答のヘッダーとして発行されます。これがアプリケーションに不明な状況である場合は、いつでも、text/plainまたはapplication/octet-stream任意のテキストまたはバイナリデータをそれぞれ指定できます。1つのオーバーロードは、該当する場合、ブラウザのダウンロードダイアログ(Content-Dispositionヘッダーを介して制御)に表示するファイル名を設定する3番目のパラメータを追加で取得します。

署名のオーバーロード

protected internal FileStreamResult File(
    Stream fileStream,
    string contentType
)

protected internal virtual FileStreamResult File(
    Stream fileStream,
    string contentType,
    string fileDownloadName
)

使用例

return File(myStream, "application/pdf");

また

return File(myStream, "application/pdf", "billing-summary.pdf");
于 2017-05-02T23:10:44.443 に答える