NET 有四种不同类型的文件结果:
这些描述取自 MSDN,除了 FileStreamResult 之外,前三个声音完全相同。那么它们之间有什么区别呢?
FileResult是所有其他类的抽象基类。
FileResult
FileContentResult
FilePathResult
FileStreamResult
然而,你很少需要使用这些类-你只需要使用 Controller.File重载中的一个,然后让 ASP.NET MVC 为你完成这个魔术。
Controller.File
好问题... 值得更多细节。我发现自己在这里是因为一个有趣的情况。我们通过 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 (保持内容处理设置器) :
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-Disposition。 使用 FileStreamResult,我得到1。
在提供文件名时,FileContentResult 会附加一个 Content-Disposition 头,而 Chrome 将该头的倍数视为错误。
奇怪的反应... ... 但绝对是一个好消息。