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

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

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

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

49689 次浏览

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

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

然而,你很少需要使用这些类-你只需要使用 Controller.File重载中的一个,然后让 ASP.NET MVC 为你完成这个魔术。

好问题... 值得更多细节。我发现自己在这里是因为一个有趣的情况。我们通过 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 将该头的倍数视为错误。

奇怪的反应... ... 但绝对是一个好消息。