代码之家  ›  专栏  ›  技术社区  ›  Robert MacLean

这四个文件在ASP.NET MVC中的结果有什么不同

  •  130
  • Robert MacLean  · 技术社区  · 15 年前

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

    • fileContentResult:将二进制文件的内容发送到响应。
    • filePathResult:将文件的内容发送到响应
    • fileresult:返回二进制输出以写入响应
    • filestreamresult:使用流实例将二进制内容发送到响应

    这些描述来自于msdn,除了filestreamresult,前三个声音是相同的。那么他们之间有什么区别呢?

    2 回复  |  直到 15 年前
        1
  •  167
  •   amhed    11 年前

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

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

    但是,您很少需要使用这些类-您可以使用 Controller.File 重载并让ASP.NET MVC为您提供魔力

        2
  •  24
  •   beauXjames    11 年前

    很好的问题…需要更多的细节。我发现自己在这里是由于一个有趣的情况。我们通过MVC3/C环境交付了一些PDF附件。我们的代码被发布了,我们开始从我们的客户那里得到一些响应,即当他们使用Chrome时,下载行为异常,文件类型被转换为“pdf-,attachment.pdf-,attachment”。是的……你明白了……整件事。所以,可以将其重写为“pdf”,文件仍然保存完整,但这真是一团糟!

    所以,为了描述初始情况,我们设置了“内容处置”头,然后返回一个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个内容处置。 有了filestreamresult,我得到了1。

    当提供文件名时,fileContentResult附加一个内容处置头,chrome将此头的倍数视为错误。

    奇怪的反应……但肯定是很好知道的。