28

我的ActionResult回报 aFile但我也需要它有条件地回报 a Stream

我无法找到有关 anActionResult如何返回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");
}

现在您不再需要从第一个操作调用第二个操作。

于 2012-12-21T06:38:01.577 回答
8

Stream在 a中使用 Action 方法的结果的最短方法Controller是您在问题中已经展示的方法:File使用Controller. 这会返回一个FileStreamResult.

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

重载签名

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 回答