ActionResult返回一个Stream

时间:2012-12-21 01:44:25

标签: c# asp.net-mvc

我的ActionResult会返回File,但我还需要它有条件地返回Stream

我无法找到有关ActionResult如何返回Stream的文档。

以下是我返回文件的代码:

    return File(memoryStream,.... )

如上所述,我只需要返回Stream

3 个答案:

答案 0 :(得分:32)

使用FileStreamResult

MemoryStream stream = someService.GetStream();

return new FileStreamResult(stream, "application/pdf")

答案 1 :(得分:6)

动作调用另一个动作是设计气味。你应该避免它。简单地说,需要在服务层中的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 :(得分:4)

Stream中使用Controller作为操作方法的结果的最短方法是您已在问题中展示的方法:使用File FileStreamResult辅助方法1}}。这将返回text/plain

有几个可用的重载需要Controller。两个重载都需要指定响应的MIME类型,它将作为响应的Stream标头发出;如果您的情况是您的应用程序未知的情况,则可以始终分别为任意文本或二进制数据指定application/octet-streamContent-Disposition。一个重载还需要第三个参数,设置文件名以在浏览器的下载对话框中显示(通过answer标题控制),如果适用的话。

重载签名

Content-Type

protected internal FileStreamResult File(
    Stream fileStream,
    string contentType
)

使用示例

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

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