`
lovnet
  • 浏览: 6914989 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

ASP.NET 檔案上傳處理—檔案大小超過限制之處理

阅读更多

ASP.NET 檔案上傳處理檔案大小超過限制之處理

/黃忠成

緣起

我於『極意之道-ASP.NET AJAX/Silverlight聖典』中放入了一個非同步擋案上傳的例子,該例利用了IFRAME技巧,巧妙的規避了AJAX無法處理FileUpload控件上傳的問題,事實上此技巧在網路上已經行之有年,我只能算是應用此技巧的多數人之一。以ASP.NET頁面來處理檔案上傳,大多會遇到兩個問題,一是上傳檔案的大小大於所設下的限制時(ASP.NET預設為4M),網頁會以連線錯誤來回應(如圖1)

1

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 272.25pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///D:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png"></imagedata></shape>

二是上傳期間,網頁會處於無回應的狀態。第一個問題緣由很簡單,因為當你按下Submit按紐時,瀏覽器便會收集資料上傳,而當上傳檔案過大時,伺服器端會拒絕接收,並切斷連線,導致瀏覽器在未送完要求(Request)時,便因連線中斷而產生錯誤訊息。那有沒有可能在伺服器端預先判斷檔案大小,若超過限制時,便做出正常回應而讓原網頁顯示較友善的錯誤訊息呢?這得分成兩個部份來談,當然!在伺服器端做出判斷後回應錯誤網頁是辦的到的,但問題在於瀏覽器尚未將所有資料上傳完畢,結果還是會因為資料未完全上傳而連線被切斷而顯示出連線錯誤的訊息。那要如何解決這個問題呢?有個手法可以巧妙的解決此問題,就是運用IFRAME搭配AJAX,利用IFRAME來裝載Upload的頁面,然後在使用者按下Submit按紐時,以JavaScriptIFRAME設為不可視,接著於伺服器端判斷上傳檔案的大小,若超過限制則直接跳離,當然!此時IFRAME會出現連線錯誤的網頁,不過由於是處於不可視狀態,所以使用者是看不到的,此時我們可以運用JavaScriptalert來顯示錯誤訊息,或是使用Redirect來導向錯誤訊息網頁,如使用alert,那麼你必須將原來的IFRAME移除,重新建立一個,避免使用者見到那個連線錯誤的網頁。

實作

有了以上的知識,要實現就不困難了,首先要準備一個用來上傳檔案的.aspx,程式碼如下所示。

UploadHandler.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="UploadHandler.aspx.cs" Inherits="UploadHandler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>Untitled Page</title>

<script language="javascript">

</script>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:FileUpload ID="FileUpload1" runat="server" />

<!-- 在上傳開始前,IFrame設為不可視,以此規避因上傳檔案過大而產生的連線錯誤頁面 -->

<asp:Button ID="Button1" OnClientClick="window.top.document.getElementById('fileframe').style.visibility = 'hidden';" runat="server"

Text="Button" />

</div>

</form>

</body>

</html>

UploadHandler.aspx.cs

using System;

using System.Collections;

using System.Configuration;

using System.Data;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.Configuration;

public partial class UploadHandler : System.Web.UI.Page

{

private int GetMaxRequestSize()

{

//取得預設的maxRequestLength設定值.

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

HttpRuntimeSection section =

config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;

return section.MaxRequestLength * 1024;

}

protected override System.Collections.Specialized.NameValueCollection

DeterminePostBackMode()

{

//此處是唯一有機會於上傳檔案之Request開始收取前,判斷大小的地方

if (Request.ContentLength > GetMaxRequestSize()) //判斷上傳檔案是否大於4 MB

{

Session["FileIsToLarge"] = true;

//利用Cache來註記檔案太大,稍後的Timer將會查詢此欄位來決定是否Redirect.

return null; //file to large

}

Session["FileIsAccept"] = true;

//接受檔案,稍後的Timer將會查詢此欄位來重新顯示IFrame

//(我們會在上傳前,IFrame隱藏,來避開顯示錯誤.)

return base.DeterminePostBackMode();

}

protected void Page_Load(object sender, EventArgs e)

{

if (IsPostBack)
{
//save file,only working at WebDev.Server
FileUpload1.SaveAs(@"c:\temp1\A" + FileUpload1.FileName);
}

}

}

此處有幾點要進一步討論,第一點是GetMaxRequestSize函式,此函式會去抓取web.config中的maxRequestLength設定值,來決定上傳限制。第二點是我覆載了DeterminePostBackMode函式,此函式是唯一可在Page開始收取大量上傳資料前做出判斷的地方,過了此函式,Page就會因為收取過大的資料,而產生例外。第三點,我利用了Session來儲存是否接受上傳的狀態,由主頁面利用ASP.NET AJAXTimer控件來定期查詢此值,若發現FileIsToLarge的值為Ture時,便立刻導向錯誤網頁,若發現FileIsAccept值為True,就代表著上傳檔案已被接受,即刻透過RegisterStartupScript函式以Javascript將隱藏的IFRAME顯示出來(當使用者按下UploadHandler.aspx中的Button按紐時,這裡會用JavascriptIFRAME隱藏起來)此頁面要放在主頁面的IFRAME中,下面是主頁面的程式碼。

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>Untitled Page</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:ScriptManager ID="ScriptManager1" runat="server">

</asp:ScriptManager>

<iframe id="fileframe" src=UploadHandler.aspx frameborder="0"

scrolling="no" style="height:60px"></iframe>

<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">

<ContentTemplate>

<asp:Timer ID="Timer1" runat="server" Interval="100" ontick="Timer1_Tick">

</asp:Timer>

</ContentTemplate>

</asp:UpdatePanel>

</div>

</form>

</body>

</html>

Default.aspx.cs

using System;

using System.Configuration;

using System.Data;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Reflection;

public partial class _Default : System.Web.UI.Page

{

protected void Timer1_Tick(object sender, EventArgs e)

{

if (Session["FileIsToLarge"] != null) //上傳檔案過大,Redirect.

{

Session.Remove("FileIsToLarge");

Response.Redirect("MaxRequestLength.htm");

}

else if (Session["FileIsAccept"] != null)

//接受上傳,IFrame重新設為可視.

{

Session.Remove("FileIsAccept");

ScriptManager.RegisterStartupScript(this, GetType(),

"DisplayFrame", "$get('fileframe').style.visibility = 'visible';", true);

}

}

}

另外,當上傳超過限制時,此例會導向另一網頁來顯示錯誤,下面是該網頁的HTML程式碼。

MaxRequestLength.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>Untitled Page</title>

</head>

<body>

Upload File size to large.

</body>

</html>

結果如我們所預期的,當選了一個較大(大於maxRequestLength設定值)的檔案來上傳時,此例立刻會導向MaxRequestLength.htm來顯示錯誤。下面是web.config的組態設定,其實大多是ASP.NET AJAX預設的設定,我標示出可改變上傳限制的部份,讀者們可自行修改。

web.config

<?xml version="1.0"?>

<configuration>

<configSections>

<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">

<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">

<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>

<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">

<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere"/>

<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>

<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>

</sectionGroup>

</sectionGroup>

</sectionGroup>

</configSections>

<system.web>

<pages>

<controls>

<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

</controls>

</pages>

<!--

Set compilation debug="true" to insert debugging

symbols into the compiled page. Because this

affects performance, set this value to true only

during development.

-->

<compilation debug="true">

<assemblies>

<add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

font-

分享到:
评论

相关推荐

    ASP.NET限制上传文件大小示例

    ASP.NET是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能来处理用户上传的文件。在实际应用中,为了防止恶意用户上传大文件导致服务器资源耗尽或存储空间溢出,我们需要对上传文件的大小进行限制。本...

    asp.net档案管理系统

    开发者需要处理文件大小限制、多文件上传、文件类型检查等问题。 4. **数据库存储**:文件元数据通常存储在关系数据库中,如SQL Server或MySQL,使用ADO.NET或Entity Framework进行数据访问。文件内容本身可能直接...

    解决ASP.NET上传文件大小限制

    ASP.NET 的文件上传大小限制是因为 ASP.NET 会将全部文件载入内存后,再加以处理。这就意味着,如果我们上传的文件太大,可能会导致内存溢出。因此,我们需要找到一种方法来解决这个问题。 解决方法是利用隐含的 ...

    asp.net实现文件夹上传、修改、删除,文件格式限制,文件大小限制c#源码

    在ASP.NET中,开发文件管理功能是常见的需求,如文件上传、修改、删除以及设置文件格式和大小的限制。这个C#源码示例提供了一个基础的实现,非常适合初学者来学习和理解相关技术。接下来,我们将深入探讨这些知识点...

    asp.net 批量上传文件

    在ASP.NET中实现批量文件上传是一项常见的需求,尤其在处理大量用户数据时。在这个场景下,我们可以使用jQuery库中的`jquery.form`插件来增强页面的交互性,并结合ASP.NET后端技术,实现异步、无刷新的批量文件上传...

    asp.net实现上传图片后并显示

    在ASP.NET中实现上传图片并在页面上显示是一个常见的需求,主要涉及到文件上传、图像处理以及前端展示等技术。以下是对这个主题的详细说明: 一、ASP.NET文件上传基础 ASP.NET提供了一些内置的控件和类来支持文件...

    Asp.Net上传文件大小限制

    总的来说,Asp.Net上传文件大小限制的调整涉及多个层次,需要综合考虑性能、安全和用户体验。正确配置这些参数,能让你的应用更好地处理大文件上传,同时避免潜在的安全风险。在M055上传文件大小限制的压缩包文件中...

    asp.net图片处理.rar

    ASP.NET 图片处理技术是Web开发中的一个重要环节,它涵盖了从上传、裁剪、缩放、旋转到水印添加等一系列图像操作。在ASP.NET框架下,开发者可以利用各种工具和库来实现这些功能,为网站提供丰富的图像服务。本文将...

    asp.net简单网络文件夹实现上传下载(限制文件类型大小)

    在这个“asp.net简单网络文件夹实现上传下载(限制文件类型大小)”的项目中,我们将探讨如何使用ASP.NET来实现在Web应用中进行文件的上传和下载,并且添加了对文件类型和大小的限制,以增强安全性。 1. 文件上传:...

    asp.net上传模块

    ASP.NET上传模块是ASP.NET应用程序中的一个重要组成部分,它允许用户通过网页将文件上传到服务器。在Web开发中,文件上传功能常用于用户提交照片、文档或其他类型的数据。在这个场景中,我们关注的是一个专为ASP.NET...

    asp.net 批量上传图片demo

    综上所述,这个ASP.NET批量上传图片的示例涵盖了文件上传、图片预览、大文件处理等多个关键知识点,对于学习和理解Web开发中的文件操作具有很高的参考价值。在实际开发中,还需要根据具体需求和环境进行适当的调整和...

    asp.net 批量上传

    在ASP.NET中,批量上传是指一次上传多个文件的功能,这对于处理大量用户上传的图片、文档或其他数据时非常有用。在本教程中,我们将探讨如何利用C#编程语言和jQuery库来实现这一功能。 首先,我们需要了解ASP.NET中...

    asp.net文件上传

    - **上传限制视图** (`view_Configure`) 显示允许上传的文件类型和大小限制。 - **上传文件视图** (`view_Upload`) 包含一个`FileUpload`控件和一个“上传”按钮。 - **管理文件视图** (`view_Manage`) 用于显示文件...

    asp.net文件上传示例

    此外,ASP.NET MVC和ASP.NET Core提供了不同的API和方法来处理文件上传,但核心概念是一样的。对于ASP.NET Core,你可能需要使用`IFormFile`接口,而路由和控制器的配置也会有所不同。 总结来说,这个"asp.net文件...

    ASP.NET上传控件

    ASP.NET上传控件是.NET框架下用于处理用户在网页上上传文件的一种组件。在ASP.NET应用中,上传控件使得用户能够方便地将本地文件上传到服务器,这在许多应用场景中都是必需的功能,例如文件共享、图片上传或文档提交...

    ASP.NET的照相及上传功能

    为了防止恶意用户上传大文件导致服务器资源耗尽,通常会设置文件大小限制,并进行文件类型验证。 3. **源码分析**:压缩包中的"Avatar"可能是指头像或用户图像的文件夹,里面包含了处理照片的ASP.NET页面(如.aspx...

    Asp.net_WEB 版 WebUploader大文件上传带进度条

    【ASP.NET Web版 WebUploader大文件上传带进度条】是一个针对ASP.NET 4.0 Web应用程序的文件上传解决方案,特别适合处理大文件并提供实时的上传进度反馈。WebUploader是一款前端JavaScript库,它允许用户在浏览器端...

    ASP.NET批量上传图片

    在ASP.NET中,批量上传图片是一项常见的功能,尤其在构建涉及用户交互的Web应用程序时,如社交媒体、电子商务网站或内容管理系统。批量上传允许用户一次性上传多个图片,提高用户体验并减轻服务器压力。以下是对这一...

    一个很好用的asp.net上传控件

    ASP.NET上传控件是网页应用开发中的重要组成部分,它允许用户在服务器端处理大量数据时上传文件。在本文中,我们将深入探讨“一个很好用的ASP.NET上传控件”,了解其特点、使用方法以及如何在项目中集成和操作。 ...

    ASP.NET 实现 上传下载案例

    同时,别忘了在后台处理文件上传的安全问题,例如限制文件类型、大小,防止文件覆盖,以及对上传的文件进行安全验证。 此外,为了提高用户体验,可以考虑使用AJAX进行异步上传,这样在上传大文件时不会阻塞页面。...

Global site tag (gtag.js) - Google Analytics