NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 2008-01-28
  • 本文字数:1923 字

    阅读完需:约 6 分钟

使用过 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><br></br> <httpRuntime executionTimeout="240" maxRequestLength="20480" /><br></br></system.web>

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

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

<location path="Upload"><br></br> <system.web><br></br> <httpRuntime executionTimeout="110" maxRequestLength="20000" /><br></br> </system.web><br></br></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("~");<br></br>HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;<br></br>double maxFileSize = Math.Round(section.MaxRequestLength / 1024.0, 1);<br></br>FileSizeLimit.Text = string.Format("Make sure your file is under {0:0.#} MB.", maxFileSize);

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

更好的解决方案

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

下面是一些常见的组件:

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

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

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

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

查看英文原文: Handling Large File Uploads in ASP.NET

2008-01-28 00:5826957
用户头像

发布了 37 篇内容, 共 82680 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

如何定制开发软件 App?

Geek_16d138

定制软件开发 app定制开发

打造“泛”资产管理平台,做企业资产的数智管家

用友BIP

资产管理

第四期 |《实时洞察 智能运营一用友企业绩效管理白皮书》解读

用友BIP

企业绩效管理

用友Fast by BIP On天翼云重磅发布,一站式服务大型企业数智化!

用友BIP

天翼云 大型企业数智化速达包

关于WMS三个核心问题的解读

万界星空科技

对话在行人|飞龙汽车:通过业财融合,年节约成本2000多万

用友BIP

Stable Diffusion 是否使用 GPU?

3D建模设计

Stable Diffusion 稳定扩散 img2img text2img AI图像合成

SketchUp Pro 2023 中文for Mac激活版下载(草图大师 2023破解)

影影绰绰一往直前

Topaz Gigapixel AI 激活密钥文件 Topaz Gigapixel AI破解版下载

影影绰绰一往直前

c#桥接模式详解

EquatorCoco

C# 编程语言 桥接模式 教程分享

LRTimelapse for Mac(延时摄影视频制作)

展初云

Mac软件 lrTimelapse 延时摄影视频制作软件

苹果Mac电脑 AutoCAD 2024 激活破解版下载

影影绰绰一往直前

CPU vs GPU:谁更适合进行图像处理?

Finovy Cloud

gpu cpu

KeyShot 2023.3 Pro for mac(3D渲染和动画制作软件)

展初云

Mac 渲染和动画软件 KeyShot

亚马逊云AI大语言模型应用下的创新Amazon Transcribe的使用

淼.

OmniGraffle for mac(绘图软件) v7.22.2中文正式版

mac

苹果mac Windows软件 OmniGraffle 图表设计软件

Mac远程控制工具 Screens 4中文最新激活版

胖墩儿不胖y

远程控制软件 Mac软件 远程工具

iStat Menus for Mac(系统活动监控软件)

展初云

Mac软件 iStat Menus

稳定扩散与潜伏扩散:哪个更好?

3D建模设计

人工智能 机器学习 Stable Diffusion Latent Diffusion

KeyShot 2023 Pro渲染器激活安装包 KeyShot 破解下载「支持m1 m2」

影影绰绰一往直前

KeyShot Pro下载 KeyShot Pro破解版 KeyShot Pro 2023下载

教您如何使用API接口获取拼多多商品详情

Noah

简单好用的数据恢复 Disk Drill激活最新中文版

mac大玩家j

数据恢复 恢复数据 Mac软件

DAPP钱包Token质押挖矿系统开发实践

l8l259l3365

代理IP按流量计费贵么?

Geek_ccdd7f

企业软件app定制开发流程

Geek_16d138

app定制开发 软件开发定制

职业倦怠无所畏惧,智慧云为你的工作增添活力

知者如C

BusyCal for Mac(任务日历工具) 2023.4.1中文激活版

mac

苹果mac Windows软件 BusyCal 日历应用程序

架构实战营-模块七作业

王朝阳

在ASP.NET中处理大文件上传_.NET_Robert Bazinet_InfoQ精选文章