我正在编辑一些代码,其中有一个方法返回FileContentResult
类型。我从服务中获取了流,所以更方便的做法是将返回类型更改为FileStreamResult
。
我应该将流转换为数组以返回FileContentResult
吗?
还是可以安全地更改返回类型?
我正在编辑一些代码,其中有一个方法返回FileContentResult
类型。我从服务中获取了流,所以更方便的做法是将返回类型更改为FileStreamResult
。
我应该将流转换为数组以返回FileContentResult
吗?
还是可以安全地更改返回类型?
FileStreamResult
和 FileContentResult
都继承自 FileResult
,FileResult
又继承自 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");
}
这样,用户将会从浏览器获取一个下载提示。
FileResult
是所有其他类的抽象基类。
FileContentResult
- 当您有一个字节数组要作为文件返回时,请使用它FileStreamResult
- 当您打开了一个流,您希望将其内容作为文件返回时使用