Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 什么';这是ASP.NET MVC中四个文件结果之间的差异_Asp.net Mvc_File_Resulttype - Fatal编程技术网

Asp.net mvc 什么';这是ASP.NET MVC中四个文件结果之间的差异

Asp.net mvc 什么';这是ASP.NET MVC中四个文件结果之间的差异,asp.net-mvc,file,resulttype,Asp.net Mvc,File,Resulttype,ASP.NET有四种不同类型的文件结果: FileContentResult:将二进制文件的内容发送到响应 FilePathResult:将文件内容发送到响应 FileResult:返回二进制输出以写入响应 FileStreamResult:使用流实例将二进制内容发送到响应 这些描述取自MSDN,除了FileStreamResult之外,前三个听起来完全相同。那么它们之间的区别是什么呢?FileResult是所有其他类的抽象基类 FileContentResult-当您有一个要作为文件返回

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

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

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

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

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

但是,您很少需要使用这些类-您可以使用一个
Controller.File
重载,让ASP.NET MVC为您发挥神奇的作用。

这是一个很好的问题……值得更多的细节。由于一个有趣的情况,我发现自己来到了这里。我们通过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);
看起来不错。在IE中工作得很好。因此我做了一些研究,并尝试实现FileStreamResult(保留内容处置设置器):

它修复了Chrome中的问题!嗯……但我为什么要把我完美的字节数组进行流式处理,然后通过它返回文件名才能正常工作呢

然后小提琴手来了

使用FileContentResult,我在标题中得到了两个内容配置。 使用FileStreamResult,我得到1

FileContentResult在提供文件名时会附加一个内容处置标头,Chrome会将此标头的倍数视为错误。


奇怪的反应…但肯定是一个好消息。

只是一个提示,在.NET 4+中,如果您无法轻松访问mime类型,您可以使用
System.Web.MimeMapping.GetMimeMapping(filename)
收集mime类型。为
文件提供文件名意味着设置其属性,它为您设置
内容配置
标题。而且它确实正确地支持utf-8文件名,而utf-8文件名不支持
ContentDisposition
helper类(有关更多详细信息,请参阅)。
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));