【问题标题】:ActionResult returning a StreamActionResult 返回一个流
【发布时间】:2012-12-08 14:57:57
【问题描述】:

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

我找不到关于 ActionResult 如何返回 Stream 的文档。

这是我返回文件的代码:

    return File(memoryStream,.... )

如前所述,我只需要返回一个Stream

【问题讨论】:

  • 文件正在流式传输到客户端,不是吗?直播给你带来了什么?
  • 我有一个 ActionResult 调用和 Actionresult。第二个 Actionresult 需要将 Stream 发送到第一个 action result,然后将更改为未存储在文件中的文件。
  • 你的问题很困惑。您没有返回 "a File",而是使用 a helper method called File() that takes a Stream and returns a FileStreamResult 返回 FileStreamResult。您已经在现有代码中得到了问题的答案,而接受的答案只是做同样事情的稍长的语法!

标签: c# asp.net-mvc


【解决方案1】:

为 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")

【讨论】:

  • 谢谢。也很好奇,是否可以只返回一个流而不将它与 pdf 关联。意思是,只返回一个流
  • @NatePet 你可以使用application/octet-stream
  • -1;这有点困惑,尽管我必须深入研究文档才能意识到这一点。 OP 的现有代码 - 调用 Controller.File with a stream as the first argument - 已经 在后台生成 FileStreamResult。你只是为 OP 的代码已经做了一个更详细的语法!
【解决方案2】:

使用Stream 作为Controller 中的操作方法的结果的最短方法是您在问题中已经显示的方法:使用ControllerFile 辅助方法。这将返回一个FileStreamResult

有几个可用的重载采用Stream。两种重载都需要指定响应的 MIME 类型,它将作为响应的 Content-Type 标头发出;如果您的情况是您的应用程序不知道这一点,您始终可以分别为任意文本或二进制数据指定text/plainapplication/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");

【讨论】:

    【解决方案3】:

    让一个动作调用另一个动作是一种设计味道。你应该避免它。简单地说,需要在服务层中的 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");
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多