FileContentResult和FileStreamResult之间的区别

我正在编辑一些代码,有一个方法返回FileContentResult类型。 我从服务获得一个流,所以对我来说,将返回类型更改为FileStreamResult会更方便。

我应该将流转换为数组以返回FileContentResult吗?

或者我可以安全地更改返回类型吗?

FileResult是所有其他的抽象基类。

  • FileContentResult – 当您有一个要作为文件返回的字节数组时使用它
  • FileStreamResult – 您打开了一个流,您希望将其内容作为文件返回

FileStreamResultFileContentResult都inheritance自从ActionResultinheritance的FileResult 。 因此,您可以从具有ActionResult作为返回类型的方法返回一种类型

如果您已有流,则可以使用FileStreamResult构造函数返回FileResult

 public ActionResult Download() { var f = Server.MapPath("~/Content/mypdf.pdf"); var fileStream = new FileStream(f,FileMode.Open,FileAccess.Read); return new FileStreamResult(fileStream, MimeMapping.GetMimeMapping(f)); } 

如果已经有字节arrray ,则可以使用FileContentResult构造函数返回FileResult

 public ActionResult Download() { var f = Server.MapPath("~/Content/mypdf.pdf"); var bytes = System.IO.File.ReadAllBytes(f); return new FileContentResult(bytes, MimeMapping.GetMimeMapping(f)); } 

Controller.File方法具有重载,它接受字节数组或流

 public ActionResult Download() { var f = Server.MapPath("~/Content/mypdf.pdf"); var bytes = System.IO.File.ReadAllBytes(f); return File(bytes, MimeMapping.GetMimeMapping(f)); } public ActionResult Download2() { var f = Server.MapPath("~/Content/mypdf.pdf"); var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read); return File(fileStream, MimeMapping.GetMimeMapping(f)); } 

如果浏览器支持显示响应的内容类型,则响应将显示在浏览器中。 例如,对于上面的代码,它将在浏览器中显示pdf内容。

File方法的另一个重载是获取浏览器的保存/下载对话框将使用的下载文件名,以便用户可以将其保存到本地计算机和/或打开。

 public ActionResult Download4() { var f = Server.MapPath("~/Content/mypdf.pdf"); var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read); return File(fileStream, MimeMapping.GetMimeMapping(f),"MyfileNiceFileName.pdf"); } 

有了这个,用户将从浏览器获得下载提示。