【问题标题】:Serving a file from an action in Asp.Net MVC. Is it better to use byte[] or Stream?从 Asp.Net MVC 中的操作提供文件。使用 byte[] 还是 Stream 更好?
【发布时间】:2011-08-30 07:46:06
【问题描述】:

当我们想通过操作提供文件(非 HTML)时,我们可以使用文件操作结果。构造函数可以接受 byte[] 或 Stream。哪一个更好?为什么?

谢谢!

【问题讨论】:

    标签: .net asp.net-mvc file stream


    【解决方案1】:

    我会使用流,我会努力将数据流式传输到客户端而不将所有数据加载到网络服务器上的byte[]

    这是确保不会将文件完全加载到服务器内存中的唯一方法,假设有 10 个人下载每个 100 Mb 的文件,最好避免 ASP.NET 进程仅因此而增长到 1GB RAM,通过流媒体,您可以做到这一点:)

    【讨论】:

    • 虽然是一个合理的答案,但这里的假设是内容很大。内容完全有可能已知相当小,在这种情况下byte[] 完全可以接受(并且可能更方便)。
    • @Marc,你能预测一下有多少用户会同时下载多少个文件吗?
    • 我也在想这个。我正在动态生成我的文件(使用 iText 或 EPPlus),所以我不知道它们最终会有多大。
    • @Davide 相关性尚不清楚...如果内容很小,它通常可能小于大多数流操作分配的默认缓冲区。一个小而短暂的数组的分配/收集可以忽略不计。如果它确实是一个“文件”,那么还有其他接受路径的重载,所以我假设我们正在动态生成等;如果生成的内容相同,缓存它!
    【解决方案2】:

    没有好坏之分,请使用最适合您情况的那个。

    例如,如果文件在磁盘上,您很可能会将其加载到流中

    var stream = File.OpeanRead("C:\myfile.ext")
    

    把它变成字节数组是没有意义的。

    但是,如果您在内存中有一个文件,它可能已经在一个字节数组中。在这种情况下,将其转换为流是没有意义的。

    【讨论】:

      【解决方案3】:

      如果您的文件在磁盘上,您可以使用 FilePathResult : http://msdn.microsoft.com/en-us/library/system.web.mvc.filepathresult.aspx

      该类使用 HttpResponse.TransmitFile,它读取文件而不将其缓冲到内存中:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.transmitfile.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-14
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 2021-11-24
        相关资源
        最近更新 更多