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

Rob*_*ean 135 asp.net-mvc file resulttype

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

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

这些描述来自MSDN,除FileStreamResult外,前三个声音相同.那么他们之间有什么区别?

mac*_*kow 173

FileResult 是所有其他人的抽象基类.

  • FileContentResult - 当您有一个要作为文件返回的字节数组时使用它
  • FilePathResult - 当你在磁盘上有一个文件并希望返回它的内容时(你给出一个路径)
  • FileStreamResult - 您打开了一个流,您希望将其内容作为文件返回

但是,你很少需要使用这些类 - 你可以使用一个Controller.File重载,让asp.net mvc为你做魔术


bea*_*mes 28

很好的问题......值得更多细节.由于有趣的情况,我发现自己在这里.我们通过MVC3/C#环境提供了一些pdf附件.我们的代码已经发布,我们开始从客户那里得到一些回复,当他们使用Chrome并且文件类型转换为'pdf-,attachment.pdf-,attachment'时,下载的行为很奇怪.是的......你得到了......整件事.因此,人们可以将其重写为'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);
Run Code Online (Sandbox Code Playgroud)

似乎很好.在IE中工作得很好.所以我做了一些研究并尝试实现FileStreamResult(保留Content-Disposition设置器):

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));
Run Code Online (Sandbox Code Playgroud)

它修复了Chrome中的问题!嗯...但为什么我应该把我的完美的字节数组和流式传输然后通过它返回它以使文件名工作正常?

然后是小提琴手.

使用FileContentResult,我在标题中获得了2个Content-Dispositions.使用FileStreamResult,我得到1.

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

奇怪的反应...但绝对是一个很好的知道.

  • 为`File`结果提供文件名意味着设置其[`FileDownloadName`](https://msdn.microsoft.com/en-us/library/system.web.mvc.fileresult.filedownloadname(v = vs.118) ).aspx)属性,为您设置`Content-Disposition`标题.它确实支持utf-8文件名,它不是`ContentDisposition`帮助类(参见[我的评论](/ questions/1012437/uses-of-content-disposition-in-an-http-response-header/22221217#comment57484455_22221217)了解更多详情). (4认同)
  • 只是一个提示,在.NET 4+中你可以使用`System.Web.MimeMapping.GetMimeMapping(filename)`来收集mime类型,如果你不能轻易访问它. (3认同)