InfoQ

新闻

在ASP.NET中处理大文件上传

作者 Robert Bazinet 译者 陈黎夫 发布于 2008年1月28日 上午12时58分

社区
.NET
主题
.NET框架,
Silverlight
标签
最佳实践,
微软,
ASP.NET

使用过ASP.NET的开发者都知道,FileUpload控件是一把双刃剑——既可能成为我们的救世主,也能变成我们的敌人。其中一个很常见的问题就是如何处理超过4MB的大文件上传。

微软的ASP.NET MVP Jon Galloway最近发表了一篇文章,其中讨论了FileUpload控件的种种使用技巧。了解了这些之后,我们即可在理论上处理任何大小的文件上传。

允许大文件上传

Jon提到,使用FileUpload控件进行文件上传是一件非常有技巧性的事情。开发者应该了解的是,之所以默认的文件大小上限为4MB,并不是因为当时的设计人员灵光一现,而是为了避免潜在DOS攻击危险。

若是攻击者提交了一个或多个大文件,往往会让服务器不堪重负。若是用户上传的文件大于4MB,将会得到“Maximum request length exceeded.”异常信息。

想增加这个尺寸的上限并没有什么难度,不过开发者需要知道怎样做才是最好的方法。默认的4MB设定于系统的machine.config文件中,不过我们在web.config中即可覆盖该值。

例如,若想将上传文件的上限提高至20MB,我们只需要这样修改:

<system.web>
<httpRuntime executionTimeout="240" maxRequestLength="20480" />
</system.web>

若是在machine.config中对该值进行了修改,那么同时受到影响的就不只是这一个网站。ASP.NET之所以设计了这样的上限,就是为了避免潜 在的攻击。所以最好的方式是在某个特定目录中进行覆盖,而不是整个应用程序。web.config文件的格式非常灵活,因此实现这样的需求也不难:

web.config文件允许级联覆盖,所以很容易就能够实现这个要求。我们可以在某个文件夹中添加web.config文件,并书写上述配置,或者干脆在web.config文件中添加一个专门的<location />标签,也能达到同样的效果:

<location path="Upload">
<system.web>
<httpRuntime executionTimeout="110" maxRequestLength="20000" />
</system.web>
</location>

对于允许大文件上传来说,改变默认的上传文件大小限制仅仅是我们要做的第一步。一篇名为文件上传的不为人知一面的文章揭示了更多有关与IIS配合完成文件上传的细节。

若是上传的文件太大的话,往往会出现一些很有意思的情况。无论maxRequestLength 在中设置成什么,IIS都会不假思索地接受,但随后在ASP.NET检查时就会抛出异常。

这篇文章还提到:

当然很容易就可以捕获到这个异常,不过这并不是我们所期待的。还有一种方法是覆写Page.OnError方法,并通过检查在发生HttpException异常时HTTP响应代码是否为400来判断,不过这也不够完美。

给用户充分提示

一个让用户很反感的做法就是误导用户,而且在Web应用程序执行操作时也不给用户任何提示。文件尺寸的限制写在web.config中,所以将一段提示文字放在web.config中也就变成了件非常自然的事。

最好的做法就是在运行时读取web.config中的httpRuntime节,并转化为HttpRuntimeSection对象。非常简单:

System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
double maxFileSize = Math.Round(section.MaxRequestLength / 1024.0, 1);
FileSizeLimit.Text = string.Format("Make sure your file is under {0:0.#} MB.", maxFileSize);

这个解决方案清晰易懂,也没有什么冗繁的代码。

更好的解决方案

还有一些商用的解决方案供我们选择。这些解决方案通过HttpHandler实现,在通过进度条给用户充分提示的同时,也让我们开发人员能够更好地控制文件大小以及上传过程中可能出现的异常。

下面是一些常见的组件:

文章建议,最好的解决方案是使用RIA,例如那些用ASP.NET和Silverlight编写的上传组件。

大多数情况下,我建议用给予Silverlight或Flash的上传组件来替代传统的FileUpload组件。这类组件不单单提供了更好的上传体验,也通常会比<input type="file">在页面上生成的文本框和按钮要漂亮一些。这个<input type="file">并不能够通过CSS添加样式,虽然总是有人尝试去寻找一些方法

虽然目前并没有什么商业上传组件使用了Silverlight,不过我们可以找到一个示例程序演示了用Silverlight进行多文件上传的方法

哪怕是如同文件上传一般微不足道的问题,我们都能够找到很多种不同的方法来解决。而最大的挑战在于分析各种不同做法的利弊,以及衡量用各个做法解决这个问题所要花费的时间和金钱。只有仔细分析计划之后,我们才能够找到最适合项目中使用的方法。


查看英文原文:Handling Large File Uploads in ASP.NET
关于上传大文件其实国内研究的还是比较多的 发表人 Kevin Chu 发表于 2008年1月29日 上午2时52分
Re: 关于上传大文件其实国内研究的还是比较多的 发表人 Jeffrey Zhao 发表于 2008年1月29日 上午5时29分
Re: 关于上传大文件其实国内研究的还是比较多的 发表人 jg h 发表于 2008年8月25日 上午2时37分
  1. 返回顶部

    关于上传大文件其实国内研究的还是比较多的

    2008年1月29日 上午2时52分 发表人 Kevin Chu

    比如:http://www.cnblogs.com/bestcomy/archive/2004/06/09/14267.aspx

  2. 返回顶部

    Re: 关于上传大文件其实国内研究的还是比较多的

    2008年1月29日 上午5时29分 发表人 Jeffrey Zhao

    国内优秀的免费的不多

  3. 返回顶部

    Re: 关于上传大文件其实国内研究的还是比较多的

    2008年8月25日 上午2时37分 发表人 jg h

    大文件传送,大照片发送,跨国文件传送,网络传输加速,跨国网络传输 Qoodaa传输精灵拥有1G以上大容量文件跨国传输功能,多种文件格式供您选择,高速便捷;且十分易于操作。让您的海外客户或同事第一时间获取你的信息。无论多大容量,现在都可以轻松传输啦!除了用Qoodaa与同事进行即时或离线文件传输外,闲暇时,您还可以用Qoodaa下载英文电影,工作娱乐两不误! 想以最快速度传输大容量文件给您海外的同事吗?现在不必为此烦恼了,只要轻松点击Qoodaa里面的上传和下载,就可以建立一个国际之间“传输专线”了。赶快试试吧!有了Qoodaa为您提供的这些服务,您就可以轻松方便地与同事朋友分享资源。这些服务都是免费的,而且简单易用。如果您还不了解,不妨今天就试试吧!了解更多,详情请登陆http://www.qoodaa.com.cn

深度内容

和Google互补的搜索引擎Wolfram|Alpha

Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

SOA契约成熟度模型

本文说明了所推荐的契约版本管理设计策略是如何与SOA成熟度模型发生联系的。文章目的是为实现版本管理和可组合性提供一个路线图。

数据服务简介

Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。

分块云计算

在本文中,Jimmy Nilsson描述了一种他在过去数年间观察到的一种正在缓慢成长的架构风格,他把这种风格称为“分块云计算”。

豆瓣网技术架构变迁

罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。

融合思想:深入探索S#arp架构

Billy McCafferty展示了S#arp架构,它在ASP.NET MVC框架的基础上,荟萃了当今的最佳实践,应用在ASP.NET Web应用程序的架构设计中。

王雷谈开源以及新兴市场计划

中国作为新兴市场中的新兴市场,是Sun在美国之外实施SSE(SUN Startup Essentials)项目重点关注的地区。在QCon Beijing 2009期间,InfoQ中文站有幸对此项目的负责人王雷先生进行了采访,探讨了关于开源、新兴市场、SSE等话题。

使用HTML5构建下一代的Web Form

HTML5 是由 WHATWG发起的,最开始的名称叫做Web Application 1.0,而后这个标准吸纳了Web Forms 2.0的标准,并一同被W3C组织所采用,合并成为下一代的HTML5标准。