你目前正处于脱机状态,正在等待 Internet 重新连接

如何在 ASP.NET 中使用 Visual C# .NET 向 Web 服务器上载文件

概要
本文分步介绍如何使用 Visual C# .NET 向 Web 服务器上载文件。文中将创建一个 Microsoft ASP.NET 文件 (WebForm1.aspx) 及其相关的代码隐藏文件 (WebForm1.aspx.cs),以便向名为 Data 的目录上载文件。


创建 ASP.NET 应用程序

在 Microsoft Visual Studio .NET 中,请按照以下步骤创建一个新的应用程序,以便向 Web 服务器上载文件:
  1. 启动 Microsoft Visual Studio .NET。
  2. 文件菜单上,指向新建,然后单击项目
  3. 新建项目对话框中,单击项目类型下的 Visual C# 项目,然后单击模板下的 ASP.NET Web 应用程序
  4. 位置框中,键入用于创建该项目的 URL。对于此示例,请键入 http://localhost/CSharpUpload,这会创建默认名称为 CSharpUpload 的项目。请注意,WebForm1.aspx 文件将加载到 Visual Studio .NET 的设计器视图中。

创建 Data 目录

在创建应用程序之后,创建将接受上载文件的 Data 目录。创建该目录之后,还必须为 ASPNET 工作帐户设置写权限。
  1. 在 Visual Studio .NET 的解决方案资源管理器窗口中,右键单击 CSharpUpload,指向添加,然后单击新建文件夹。默认情况下,将创建一个名为 NewFolder1 的新文件夹。
  2. 要将文件夹名称更改为 Data,请右键单击 NewFolder1,单击重命名,然后键入 Data
  3. 启动 Windows 资源管理器,然后找到在步骤 2 中创建的 Data 文件系统文件夹。默认情况下,该文件夹位于以下文件夹中:
    C:\Inetpub\wwwroot\CSharpUpload\Data
  4. 要更改安全设置以授予对 Data 目录的写权限,请右键单击 Data,然后单击属性
  5. Data 属性对话框中,单击安全选项卡,然后单击添加
  6. 在“选择用户或组”对话框中,单击 ASPNET 帐户,然后单击添加。单击确定以关闭“选择用户或组”对话框。
  7. 单击 aspnet_wp account (computername\ASPNET) 帐户,然后为以下权限单击以选择允许复选框:

    • 读取和执行
    • 列出文件夹内容
    • 读取
    • 写入

    单击以清除任何其他的允许拒绝复选框。
  8. 单击确定以关闭 Data 属性对话框。您已成功修改了 Data 目录的权限,可以接受用户上载的文件。

修改 WebForm1.aspx 页

要修改 WebForm1.aspx 文件的 HTML 代码以允许用户上载文件,请执行下列步骤:
  1. 返回到打开的 Visual Studio .NET 实例。WebForm1.aspx 将在设计器窗口中打开。
  2. 要查看 WebForm1.aspx 页的 HTML 源,请在“设计器”窗口中右键单击 WebForm1.aspx,然后单击查看 HTML 源
  3. 找到以下 HTML 代码,其中包含 <form> 标记:
    <form id="Form1" method="post" runat="server">					
  4. enctype="multipart/form-data" 名称-值属性添加到 <form> 标记中,如下所示:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">					
  5. 在打开的 <form> 标记后面,添加以下代码:
    <INPUT type=file id=File1 name=File1 runat="server" /><br><input type="submit" id="Submit1" value="Upload" runat="server" />					
  6. 请确认 HTML <form> 标记按如下方式显示:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server"><INPUT type=file id=File1 name=File1 runat="server" /><br><input type="submit" id="Submit1" value="Upload" runat="server" /></form>					

向 WebForm1.aspx.cs 代码隐藏文件添加上载代码

要修改 WebForm1.aspx.cs 代码隐藏文件以使它接受上载数据,请执行以下步骤:
  1. 视图菜单上,单击设计
  2. 双击上载。Visual Studio 将打开 WebForm1.aspx.cs 代码隐藏文件并自动生成以下方法代码:
    private void Submit1_ServerClick(object sender, System.EventArgs e){}
  3. 请确认类级别的 WebForm1.cs 文件中存在以下代码:
    protected System.Web.UI.HtmlControls.HtmlInputFile File1;protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;						
    如果该文件中不存在此代码,则将此代码添加到文件中以下行的后面:
    public class WebForm1 : System.Web.UI.Page{					
  4. 找到下面的代码:
    private void Submit1_ServerClick(object sender, System.EventArgs e){					
  5. 按 Enter 键添加一个空白行,然后添加以下代码:
    if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) ){	string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);				string SaveLocation = Server.MapPath("Data") + "\\" +  fn;	try	{		File1.PostedFile.SaveAs(SaveLocation);					Response.Write("The file has been uploaded.");	}	catch ( Exception ex )	{		Response.Write("Error: " + ex.Message);	}}else{	Response.Write("Please select a file to upload.");}						
    此代码首先验证是否已上载文件。如果未选择文件,您将收到“请选择要上载的文件”消息。如果上载了一个有效文件,则使用 System.IO 命名空间提取其文件名,并将其目标组合在 SaveAs 路径中。在知道最终目标之后,将使用 File1.PostedFile.SaveAs 方法保存该文件。任何异常都将被捕获,并且屏幕上会显示该异常消息。
  6. 确认 Submit1 子例程显示为下面的形式:
    private void Submit1_ServerClick(object sender, System.EventArgs e){	if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )	{		string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);		string SaveLocation = Server.MapPath("Data") + "\\" +  fn;		try		{			File1.PostedFile.SaveAs(SaveLocation);			Response.Write("The file has been uploaded.");		}		catch ( Exception ex )		{			Response.Write("Error: " + ex.Message);		}	}	else	{		Response.Write("Please select a file to upload.");	}}					

测试应用程序

要生成 Visual Studio .NET 解决方案并测试该应用程序,请执行以下步骤:
  1. 生成菜单上,单击生成解决方案
  2. 在解决方案资源管理器中,右键单击 WebForm1.aspx,然后单击“在浏览器中查看”。
  3. 在浏览器中打开 WebForm1.aspx 之后,单击浏览
  4. 选择文件对话框中,选择一个小于 4 MB 的文件,然后单击打开
  5. 要上载该文件,请单击上载。请注意,该文件将上载到 Web 服务器,并且您将收到“文件已上载”消息。
  6. 返回到打开的 Windows 资源管理器实例,然后找到 Data 目录。
  7. 验证已将文件上载到 Data 目录。

上载大文件

默认情况下,ASP.NET 只允许将 4,096 KB(即 4 MB)或以下的文件上载到 Web 服务器。要上载较大的文件,您必须在 Web.config 文件中更改 <httpRuntime> 节的 maxRequestLength 参数。

注意:如果在 Machine.config 文件中设置了 maxRequestLength 属性,然后发布的请求(例如文件上载)超出了 maxRequestLength 的值,则无法显示自定义错误页面。相反,Microsoft Internet Explorer 将显示一条“Cannot find server or DNS”(找不到服务器或 DNS)错误信息。

如果想要更改所有计算机(而不仅限于此 ASP.NET 应用程序)的这个设置,则必须修改 Machine.config 文件。

默认情况下,Machine.config 文件中的 <httpRuntime> 元素被设置为以下参数:
<httpRuntime executionTimeout="90" maxRequestLength="4096"useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4"appRequestQueueLimit="100"/>				
Machine.config 文件位于 \System Root\Microsoft.NET\Framework\Version Number\CONFIG 目录中。


完整代码列表

WebForm1.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CSharpUpload.WebForm1" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML>  <HEAD>    <title>WebForm1</title>    <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">    <meta name="CODE_LANGUAGE" Content="C#">    <meta name=vs_defaultClientScript content="JavaScript">    <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">  </HEAD>  <body MS_POSITIONING="GridLayout"><form id="Form1" method="post" enctype="multipart/form-data" runat="server"><INPUT type=file id=File1 name=File1 runat="server" ><br><input type="submit" id="Submit1" value="Upload" runat="server" NAME="Submit1"></form>	  </body></HTML>				

WebForm1.aspx.cs

using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;namespace CSharpUpload{	/// <summary>	/// Summary description for WebForm1.	/// </summary>	public class WebForm1 : System.Web.UI.Page	{		protected System.Web.UI.HtmlControls.HtmlInputFile File1;		protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;			private void Page_Load(object sender, System.EventArgs e)		{			// Put user code to initialize the page here		}		#region Web Form Designer generated code		override protected void OnInit(EventArgs e)		{			// 			// CODEGEN: This call is required by the ASP.NET Web Form Designer.			// 			InitializeComponent();			base.OnInit(e);		}				/// <summary>		/// Required method for Designer support - do not modify		/// the contents of this method with the code editor.		/// </summary>		private void InitializeComponent()		{    			this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);			this.Load += new System.EventHandler(this.Page_Load);		}		#endregionprivate void Submit1_ServerClick(object sender, System.EventArgs e){	if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )	{		string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);		string SaveLocation = Server.MapPath("Data") + "\\" +  fn;		try		{			File1.PostedFile.SaveAs(SaveLocation);			Response.Write("The file has been uploaded.");		}		catch ( Exception ex )		{			Response.Write("Error: " + ex.Message);		}	}	else	{		Response.Write("Please select a file to upload.");	}}	}}				
更多信息
理论上,最大文件上载大小是相当大的。但是,由于 ASP.NET 的运行状况监视,无法在 ASP.NET 中上载很大的文件。ASP.NET 辅助进程具有 2 GB 的虚拟地址空间。但是,由于运行状况监视和内存碎片,ASP.NET 辅助进程只能使用稍多于 1 GB 的空间。

在上载过程中,ASP.NET 首先将整个文件加载到内存中,然后用户才可以将文件保存到磁盘上。因此,此进程可能会由于 Machine.config 文件中的 processModel 标记的 memoryLimit 属性而回收。memoryLimit 属性指定了 ASP.NET 辅助进程在自动回收之前可以占用的物理内存的百分比。回收可防止因内存泄漏而导致 ASP.NET 崩溃或停止响应。

另外,其他因素也会影响可以上载的最大文件大小。这些因素包括可用内存、可用硬盘空间、处理器速度和当前网络流量。对于上载的常规流量的文件,Microsoft 建议您让最大文件大小介于 10 到 20 MB 之间。如果很少上载文件,则最大文件大小可以为 100 MB。

注意:在 ASP.NET 中,可以上载大于 100 MB 的文件。但是,Microsoft 建议您不要超出本文中提到的最大文件上载大小。要确定更加精确的文件大小,请对一些类似于在生产中使用的计算机执行压力测试。

如果在文件上载过程中遇到了文件大小限制,可能会看到以下错误信息:
  • The page cannot be displayed.
  • Server Application is Unavailable
    在事件日志中,该错误信息将与以下内容类似:

    aspnet_wp.exe (PID:PIDNumber) 被回收,因为内存消耗超过了 SizeLimit MB(可用 RAM 的百分之 Percentage)。

  • Exception of type System.OutOfMemoryException was thrown.
您还可能发现上载进行得非常缓慢。如果在 Windows 任务管理器中监视 Aspnet_wp.exe 进程,您将注意到内存的增量变化为每 1 至 2 秒 64 KB。根据文件的大小,这种延迟可能会导致 ASP.NET 辅助进程由于 responseDeadlock 错误而回收。
属性

文章 ID:323246 - 上次审阅时间:05/21/2007 03:03:11 - 修订版本: 5.8

Microsoft ASP.NET 1.0, Microsoft Visual C# .NET 2002 标准版, Microsoft ASP.NET 1.1, Microsoft Visual C# .NET 2003 标准版

  • kbhowtomaster KB323246
反馈