FileContentResult和FileStreamResult之间的区别

38

我正在编辑一些代码,其中有一个方法返回FileContentResult类型。我从服务中获取了流,所以更方便的做法是将返回类型更改为FileStreamResult

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

还是可以安全地更改返回类型?

2个回答

54

FileStreamResultFileContentResult 都继承自 FileResultFileResult 又继承自 ActionResult。因此,你可以从返回类型为 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));
}

如果您已经有一个字节数组,您可以使用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 方法有多种重载,可以接受字节数组或流(stream)作为参数。

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");
}

这样,用户将会从浏览器获取一个下载提示。


5
客户端无法区分。客户端无法查找用于向浏览器发送字节的.NET类。 - usr
如果我需要在网页的特定部分显示文件怎么办?当前的文件流会呈现整个网页。我们能否针对页面中的小区域进行定位呢? - Unbreakable
我猜你可以尝试在iframe中加载。不过我自己从未尝试过。 - Shyju
这是错误的。任何一种方法都可以强制下载或直接在浏览器窗口中呈现(假设内容类型是浏览器能够处理的)。这取决于你使用的重载。 - Chris Pratt

42

https://dev59.com/g3M_5IYBdhLWcg3w3nbz#1187270 - ChrisHiebert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接