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

文章翻译 文章翻译
文章编号: 323246 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文分步介绍如何使用 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);

		}
		#endregion

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.");
	}
}
	}
}
				

更多信息

理论上,最大文件上载大小是相当大的。但是,由于 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 错误而回收。

参考

有关其他信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
<httpRuntime> 元素
http://msdn2.microsoft.com/en-us/library/e1f13641(vs.71).aspx

INPUT 元素
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/input.asp

ENCTYPE 属性
http://msdn2.microsoft.com/en-us/library/ms533745.aspx

HtmlInputFile 类
http://msdn2.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlinputfile(vs.71).aspx

HtmlInputFile.PostedFile 属性
http://msdn2.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlinputfile.postedfile(vs.71).aspx

属性

文章编号: 323246 - 最后修改: 2007年5月21日 - 修订: 5.8
这篇文章中的信息适用于:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 标准版
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 标准版
关键字:?
kbhowtomaster KB323246
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com