惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
I
InfoQ
The Register - Security
The Register - Security
L
LangChain Blog
H
Help Net Security
The GitHub Blog
The GitHub Blog
S
Schneier on Security
博客园 - 【当耐特】
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
IT之家
IT之家
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
H
Heimdal Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
雷峰网
雷峰网
N
Netflix TechBlog - Medium
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - 聂微东
PCI Perspectives
PCI Perspectives
Last Week in AI
Last Week in AI
A
Arctic Wolf
宝玉的分享
宝玉的分享
T
The Blog of Author Tim Ferriss
S
Secure Thoughts
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
SecWiki News
SecWiki News
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Schneier on Security
Schneier on Security
P
Proofpoint News Feed
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AI
AI
Engineering at Meta
Engineering at Meta

博客园 - 曾伟

不干胶、热敏打印 wpf 滚屏数据显示 net core quartz调度 warp打包 nssm部署到windowsservice c# webapi 过滤器token、sign认证、访问日志 c# NPOI文件操作 c# ini文件操作 WCF多种调用方式兼容 网页打印javascript:window.print() window.showModalDialog弹出对话框刷新问题 ASP.NET] 选择文件夹的对话框 常用SQL语句书写技巧 控制同一exe程序打开多次 - 曾伟 - 博客园 IIS6 MMC检测到此管理单元发生一个错误,建议您关闭并重新启动mmc Lucene的例子 javascript 获取标签具体位置 - 曾伟 - 博客园 JavaScript实现类,有多种方法。 Javascript实现截图功能(代码) 终端服务器超出了最大允许连接数 DBCC CHECKDB 数据库或表修复
在上传文件时限制上传文件的大小,并捕捉超过文件大小限制的 - 曾伟 - 博客园
曾伟 · 2010-12-22 · via 博客园 - 曾伟

在上传文件时限制上传文件的大小,并捕捉超过文件大小限制的

在上传文件时,我们可以在web.config里设置允许上传的文件大小。但是,当上传的文件超过设置的限制时,在Application_Error事件里是无法捕捉到这个异常的。下面,就是捕捉上传文件超过设置大小的方法:
首先,在web.config里设置允许一次上传的文件的总大小;

Web.config 文件

<httpRuntime maxRequestLength="400" executionTimeout="3600" appRequestQueueLimit="10000"/>

 其次,在Global里加入如下的代码:

C# 代码

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Configuration" %><script RunAt="server">
  
protected void Application_BeginRequest(object sender, EventArgs e)
  {
//本代码的功能是检查页面请求的大小,如果超过了配置文件maxRequestLength的设定值,就提示用户超过了所允许的文件大小。
    
    
    
//从配置文件里得到配置的允许上传的文件大小
    HttpRuntimeSection runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime");//maxRequestLength 为整个页面的大小,不仅仅是上传文件的大小,所以扣除 100KB 的大小,
    
//maxRequestLength单位为KB
    int maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;//当前请求上下文的HttpApplication实例
    HttpContext context = ((HttpApplication)sender).Context;
    
    
//判断请求的内容长度是否超过了设置的字节数
    if (context.Request.ContentLength > maxRequestLength)
    {
      
//得到服务对象
      IServiceProvider provider = (IServiceProvider)context;
      HttpWorkerRequest workerRequest 
= (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));//检查请求是否包含正文数据
      if (workerRequest.HasEntityBody())
      {        
        
//请求正文数据的长度
        int requestLength = workerRequest.GetTotalEntityBodyLength();
        
//得到加载的初始字节数
        int initialBytes = 0;
        
if (workerRequest.GetPreloadedEntityBody() != null)
          initialBytes 
= workerRequest.GetPreloadedEntityBody().Length;
        
        
//检查是否所有请求数据可用
        if (!workerRequest.IsEntireEntityBodyIsPreloaded())
        {
          
byte[] buffer = new byte[512000]; 
          
//设置要接收的字节数为初始字节数
          int receivedBytes = initialBytes;
          
//读取数据,并把所有读取的字节数加起来,判断总的大小
          while (requestLength - receivedBytes >= initialBytes)
          {
            
//读取下一块字节
            initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length);
            
//更新接收到的字节数
            receivedBytes += initialBytes;
          }
          initialBytes 
= workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes);
        }
      }
      
//请求重定向到上载页面,并给用户提示信息。
      context.Response.Redirect(this.Request.Url.LocalPath + "?error=" + Server.UrlEncode("您上传的文件超过了允许的大小。"));
    }

  }

</script>

最后,上传的页面设置如下:

ASPX 代码

<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">
  protected 
void Button1_Click(object sender, EventArgs e)
  {
    FileUpload1.SaveAs(Server.MapPath(
"~") + "\\" + System.IO.Path.GetFileName(FileUpload1.FileName));
    err.Text 
= "";
  }

  protected 

void Page_Load(object sender, EventArgs e)
  {
    
if (!String.IsNullOrEmpty(Request.QueryString["error"]))
    {
      err.Text 
= Server.HtmlEncode(Request.QueryString["error"]);
    }
  }
</script><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  
<title></title>
</head>
<body>
  
<form id="form1" runat="server" action="?">
  
<asp:FileUpload ID="FileUpload1" runat="server" />
  
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上载" />
  
<div><asp:Label ID="err" runat="server" ForeColor="Red"></asp:Label></div>
  
</form>
</body>
</html>

posted on 2010-12-22 15:09  曾伟  阅读(1784)  评论()    收藏  举报