ASP.NET MVC中的四个文件结果之间有什么区别


136

ASP.NET具有四种不同类型的文件结果:

  • FileContentResult:将二进制文件的内容发送到响应。
  • FilePathResult:将文件的内容发送到响应
  • FileResult:返回二进制输出以写入响应
  • FileStreamResult:使用Stream实例将二进制内容发送到响应

这些描述来自MSDN,除了FileStreamResult之外,前三个听起来完全相同。那么它们之间有什么区别呢?

Answers:


176

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

  • FileContentResult -当您想要将字节数组作为文件返回时,可以使用它
  • FilePathResult -当磁盘上有文件并且想要返回其内容时(提供路径)
  • FileStreamResult -您打开了一个流,想要将其内容作为文件返回

但是,您几乎不必使用这些类-您只需使用Controller.File重载之一,然后让ASP.NET MVC为您做魔术。


29

很好的问题...,值得更多的细节。由于一种有趣的情况,我发现自己在这里。我们通过MVC3 / C#环境提供了一些pdf附件。我们的代码已发布,我们开始从客户那里得到一些回应,这些信息是:当他们使用Chrome时下载行为异常,并且文件类型已转换为“ pdf-,attachment.pdf-,附件”。是的...你明白了...整个事情。因此,可以将其重写为“ pdf”格式,并且该文件仍会保存完整,但真是一团糟!

因此,为了描述初始情况,我们先设置“ Content-Disposition”标头,然后返回FileContentResult ...

var cd = new System.Net.Mime.ContentDisposition
            {
                FileName = result.Attachment.FileName,
                Inline = false
            };
            Response.AppendHeader("Content-Disposition", cd.ToString());

return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);

看起来不错。在IE中工作正常。因此,我做了一些研究,并尝试实现FileStreamResult(保留Content-Disposition setter):

MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));

它已修复了Chrome中的问题!嗯...但是为什么我该不得不采取我非常好的字节数组并将其流式传输,然后通过此方法返回它才能使文件名正常工作?

然后是提琴手。

有了FileContentResult,我在标题中得到了2个Content-Dispositions。有了FileStreamResult,我得到了1。

提供文件名时,FileContentResult会附加一个Content-Disposition标头,Chrome会将此标头的倍数视为错误。

奇怪的反应...但绝对是一个很好的认识。


3
提示:在.NET 4+中,System.Web.MimeMapping.GetMimeMapping(filename)如果您不能轻松访问它,则可以使用它来收集mime类型。
2014年

4
File结果提供文件名意味着设置其FileDownloadName属性,从而Content-Disposition为您设置标题。而且它确实正确支持utf-8文件名,而该文件名没有ContentDisposition帮助类(有关更多详细信息,请参见此处评论)。
弗雷德里克

1
是的,谢谢@Frédéric,所有SO职位中只有您一个人向我解释了发生了什么!
Nacht
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.