【问题标题】:IIS7 + ASP.NET Large Media File DownloadingIIS7 + ASP.NET 大型媒体文件下载
【发布时间】:2012-09-10 23:42:12
【问题描述】:

我正在尝试创建一个允许大文件下载的网站(下载是指浏览器不会尝试播放视频或显示文本文件。我想强制用户选择一个地方保存文件)在 ASP.NET v4 和 IIS7 中,但是我遇到了一些问题,坦率地说,这让我很烦。

现在,我发现了一个网站,它提供了一种通过 http 流式传输甚至非常大的文件的方法: http://www.cnblogs.com/bestcomy/archive/2004/08/10/31950.aspx

然而,这个来源的问题是,当这个文件正在下载时,我无法向 http 发送任何其他请求。因此,如果用户尝试一次下载多个文件,它会一直停留在那里,直到第一个请求完成。

有没有什么方法可以执行非常大的基于媒体的文件下载,允许用户一次下载多个文件,并且需要用户选择保存位置,而不是必须右键单击并另存为?

编辑:只是为了扩展这一点,下载在会话页面后面(用户登录),所以我可以防止未经授权的用户下载文件(通过匿名的安全性不是安全性:P)。无论如何,我可以打开一个新的浏览器会话,然后登录并下载另一个文件(甚至是同一个文件),但是,任何进一步的请求都会在那里“加载”,直到下载完成。

另一个编辑:我正在使用 Razor MVC 框架,如果这改变了任何东西

谢谢!

【问题讨论】:

  • 您需要即时生成媒体文件吗?如果不是,而且它们是静态文件,我只需设置一个单独的 Apache 服务器(或多个)来处理大型静态文件 - 这是它擅长的。如果你想强制下载,我想你只需要通过配置覆盖 MIME 类型。通过您的应用程序复制数据效率非常低。
  • 为什么不能一次下载多个文件?它应该支持它,除非您在该请求中使用 SessionState。
  • 我想我可以设置一个 apache 服务器。我没有考虑过(我确实考虑过制作一个基于 C# 的文件服务器,但话又说回来,apache 是一个漂亮的服务器)。我确实使用每个下载请求的会话状态。我在允许下载文件之前进行身份验证(媒体不是即时生成的)。我曾考虑过使用 FTP,但该网站的目的是让用户不必做太多事情(Fisher Price 是目标)。

标签: asp.net .net iis download


【解决方案1】:

我相信您可以做的是从 IIS 中删除文件处理程序,这将导致文件被下载而不是被打开。尽管我自己没有尝试过,但我认为这应该可行。 http://technet.microsoft.com/en-us/library/cc771240(v=ws.10).aspx

【讨论】:

  • 问题是,我需要在直接访问文件之间进行某种“过滤”。我不希望任何普通的 joe 能够访问这些文件,因此它们必须通过 ASP 页面而不是 IIS 可以访问。谢谢你的建议。我仍然会通读它,看看它是否是我可能想做的事情。 :)
【解决方案2】:

现在有了更多的上下文,我认为这可以简化很多:

要允许并发下载,您需要确保 Session 是只读的。在 MVC3 中,您将使用 [SessionState(SessionStateBehavior.ReadOnly)] 装饰您的控制器,以进行自定义安全检查。现在,我不知道您的实现,但考虑到安全性通常是通过使用 Authorize 属性或类似属性来处理的。

现在,要强制提示保存文件而不是默认打开文件,请查看 Darin 在以下帖子中的回答:https://stackoverflow.com/a/5830215/1373170

如果标准FileResult 适合您的需求,您可以避免使用自定义代码下载文件。

【讨论】:

  • 问题是,我需要会话来确保任何人都无法下载文件。也许我的下载方式不对?
  • 只读会话是否足以进行检查?尝试将 IRequiresSessionState 切换为 IReadOnlySessionState。只读版本不应锁定会话并允许多个并发请求(stackoverflow.com/a/10139034/1373170
  • 我本来没看懂你对“HTTPHandler”的评论,后来google了好几遍,不知道怎么实现我的HTTP处理程序。因此,一旦我弄清楚了那部分,我将实现我的下载功能,并让你知道它是如何进行的(此处为 ASP/IIS 新手)
  • 实际上,一个 HTTPHandler 本来适合 asp.net 站点的。在您的情况下,由于您使用的是 MVC3,因此您可以在控制器中实现所有这些,并通过使用 [SessionState(SessionStateBehavior.ReadOnly)] 装饰控制器来更改会话行为
  • 哇,明白了。太感谢了!我真的认为这将是 ASP 的一个徒劳的限制。 :) 干杯!
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2010-12-29
相关资源
最近更新 更多