Linux 之父出席、干货分享、圆桌讨论,精彩尽在 OpenCloudOS 社区开放日,报名戳 了解详情
写点什么

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

  • 2008 年 1 月 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 年 1 月 28 日 00:5826537
用户头像

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

关注

评论

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

面向软件 IT 专业的高校大学生职业规划问卷调查

打工人!

IT 问卷调查 职业生涯规划

chia奇亚分币软件开发|chia奇亚分币APP系统开发

系统开发

聪明人的训练(二十六)

Changing Lin

4月日更

近期值得关注的四款工具

彭宏豪95

效率 工具 Mac 4月日更

RocketMQ 在使用上的一些排坑和优化

AI乔治

Java 架构 分布式 RocketMQ 高并发

拍立淘创始人潘攀博士为你揭开“以图搜图”的神秘面纱!

博文视点Broadview

Linux字符截取命令-cut

进击的梦清

Linux 运维 xshell

基于MySQL存储的自研消息队列架构设计文档

Geek_2e7dd7

Golang easyjson

escray

学习 极客时间 Go 语言 4月日更

硬核系列 | 手写脚本语言编译器(一)

高翔龙

Java 编译器 脚本语言 词法分析器 编译器原理

聚力边缘计算 共建数字中国丨浪潮边缘云ICP Edge 2.0 全新发布

浪潮云

2021团体程序设计天梯赛-部分题解

玄兴梦影

算法 比赛 算法解析

腾讯云TcaplusDB数据库服务《上古卷轴:刀锋》 助力手游行业发展

数据人er

数据库 nosql TcaplusDB Tcaplus 国产数据库

Java-技术专题-多线程顺序执行的8种方案实现

浩宇天尚

Java 并发编程 AQS 多线程 JUC

IT 专业的高校大学生编程技能及就业问卷调研

Yano

问卷调查

怎么理解组织?

石云升

团队建设 28天写作 职场经验 管理经验 4月日更

容器 & 服务: 扩容(二)

程序员架构进阶

容器 k8s 28天写作 弹性扩容 4月日更

贝壳基于 Flink 的实时计算演进之路

Apache Flink

flink

南京的春天

小天同学

随笔 4月日更 春天 南京 散文

【TcaplusDB小知识】TcaplusDB的技术原理

数据人er

数据库 nosql TcaplusDB 国产数据库

阿里P8独家揭秘:短期内升职加薪的方法,到底是什么?

Java架构师迁哥

JVM类加载机制笔记

六维

4月日更 JVM类加载

网络协议学习笔记 Day5

穿过生命散发芬芳

网络协议 4月日更

【死磕JVM】什么是JVM调优?

牧小农

JVM jvm调优 JVM基础

MySQL 死锁套路:一次诡异的批量插入死锁问题分析

AI乔治

Java MySQL 架构

金三银四 Java 架构面试指南上线, 1000 余道大厂面试真题,送你上岸

Java 编程 程序员 架构 面试

Rust从0到1-代码组织-路径

rust 路径 代码组织 paths

教育是限制吗?

箭上有毒

4月日更

腾讯云TcaplusDB数据库联合盛趣游戏打造《上古卷轴:刀锋》传奇

TcaplusDB

数据库 nosql 技术 后端

2021金三银四最新拼多多 +蚂蚁金服 +头条(已拿offer),面试真题分享!

Java 编程 程序员 架构 面试

基于区块链技术的去中心化自治组织——核心属性、演进脉络与应用前景

CECBC

区块链

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