即刻获取 HarmonyOS应用开发者基础/高级认证 了解详情
写点什么

在 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:5827055
用户头像

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

关注

评论

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

在线HTML转YAML工具

入门小站

工具

分布式协议-Paxos

白裤

PAXOS paxos协议 Basic paxos 5月月更

亚马逊AWS特约评委揭秘FinClip黑客松获胜秘诀

Geek_99967b

SaaS 小程序容器 小程序开发 小程序组件

云原生平台 Kyma 上创建的 Lambda Function 的技术实现细节介绍

汪子熙

Kubernetes 云原生 SAP Kyma 5月月更

大厂员工过劳死,打工人该如何自救?

大数据梦想家

大数据 程序员 程序人生

读万卷书为何无用?

大数据梦想家

程序员 个人成长 读书感悟

微幕小程序,给市场一个新的想象空间

Geek_99967b

小程序容器 小程序开发

NFT DeFi基础设施AFKDAO 完成300万美元融资 Hoo Labs等参投

区块链前沿News

Hoo AFKDAO

2022 携程提前批大数据一二(oc) 面经

大数据梦想家

大数据 面经分享

浅析大模型在自然语言处理方面的应用

算AI

人工智能 机器学习 产品 算法 5月月更

Python写实用小工具-实现图片转字符画

okokabcd

Python

在KVM中运行苹果操作系统

lyan

模板化的封装,降低业务代码开发

Java 架构 业务

大数据开发面试之26个Spark高频考点

大数据梦想家

大数据 spark 八股文

过去一年对我帮助最大的三本书

大数据梦想家

个人成长 程序人生 读书总结

下载Spring4.1.x源码并用IntelliJ IDEA打开

程序员欣宸

Java 5月月更

Flutter的特别之处

Geek_99967b

SaaS 小程序开发 小程序组件

在黑客马拉松中有什么样的收获?

Geek_99967b

SaaS 黑客松 小程序组件

抖音日均拦截93%诈骗行为:如何打击互联网诈骗行为

石头IT视角

Kafka 核心知识点灵魂 16 问

大数据梦想家

大数据 kafka 八股文

在线火星文转简体中文工具

入门小站

工具

一起来体验小程序应用的独特魅力

Geek_99967b

SaaS应用 finclip 小程序容器

LabVIEW仪器控制:智能直流电源(科睿源KA3003)

不脱发的程序猿

串口通信 工业自动化 直流电源控制软件 LabVIEW仪器控制

LabVIEW仪器控制:智能显示屏(数码管显示屏)

不脱发的程序猿

串口通信 工业自动化 LabVIEW仪器控制 数码管显示屏软件 数码管显示屏

融云漫话:没有一个人躲得过“视频会议”

融云 RongCloud

我的编程学习经历

留乘船

学习

Java Core「3」volatile 关键字

Samson

学习笔记 5月月更 Java core

【变量规则,HTML 转义,非法导入名称】flask框架总结(三)

恒山其若陋兮

5月月更

Amazon Kinesis Data Streams 实现跨账户应用日志收集

亚马逊云科技 (Amazon Web Services)

日志 Data

如何以极客的方式探索小程序容器技术

Geek_99967b

SaaS应用 小程序转app 跨端运行

大厂裁员登上热搜,谈谈我的3点认知

大数据梦想家

大数据 个人成长 程序人生 裁员

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