如何使用 Visual C#.NET,將檔案上載至 ASP.NET 中的網頁伺服器

文章翻譯 文章翻譯
文章編號: 323246 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您,如何使用 Visual C#.NET,將檔案上載至 Web 伺服器。您在這份文件建立 Microsoft ASP.NET 檔案 (WebForm1.aspx) 和其相關的程式碼後置的檔案 (WebForm1.aspx.cs) 將檔案上載到名為資料的目錄。


建立 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] 的 [專案設計工具] 檢視中。

建立資料目錄

建立應用程式之後您要建立會接受上載的檔案的 [資料] 目錄。建立這個目錄後,您也必須設定 ASPNET 工作者帳戶的寫入權限。
  1. Visual Studio.NET 的 [方案總管] 視窗中 CSharpUpload] 上按一下滑鼠右鍵,指向 [新增],然後再按一下 [新增資料夾]。預設情況下,建立新的資料夾,名為 NewFolder1。
  2. 若要變更資料夾名稱至資料,NewFolder1] 上按一下滑鼠右鍵、 按一下 [重新命名,然後鍵入 [資料]。
  3. 啟動 Windows 檔案總管],然後找出您在步驟 2 中建立 [資料檔案系統資料夾。預設情況下,此資料夾位於下列資料夾:
    C:\Inetpub\wwwroot\CSharpUpload\Data
  4. 變更安全性設定,以授與寫入資料] 目錄的權限 資料 上, 按一下滑鼠右鍵,然後再按 [內容]
  5. 在 [資料屬性] 對話方塊按一下 [安全性] 索引標籤,然後按一下 [新增]。
  6. 在 [選取使用者或群組] 對話方塊按一下 ASPNET] 帳戶,然後按一下 [新增]。按一下 [確定] 以關閉 [選取使用者或群組] 對話方塊。
  7. 按一下 aspnet_wp 帳戶 (computername \ASPNET) 帳戶,然後再按一下以選取下列權限的 [允許] 核取方塊:

    • 讀取及執行
    • 列出資料夾內容
    • 讀取
    • 寫入

    按一下以清除任何其他 允許 及 [拒絕] 核取方塊。
  8. 按一下 [確定] 以關閉 [資料屬性] 對話方塊。您已經成功地修改資料目錄權限來接受使用者上載檔案。

修改 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 ="多重/表單資料的 「 名稱值屬性以 <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 程式碼後置 (Code-Behind) 檔案

如果要修改 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);
    		//Note: Exception.Message returns a detailed message that describes the current exception. 
    		//For security reasons, we do not recommend that you return Exception.Message to end users in 
    		//production environments. It would be better to put a generic error message. 
    	}
    }
    else
    {
    	Response.Write("Please select a file to upload.");
    }
    這段程式碼首先會驗證檔案上載。如果不選取任何檔案,是您會收到 「 請選擇要上載的檔案"訊息。如果上載有效的檔案其檔案名稱來擷取使用 System.IO] 命名空間,它的目的地組譯 另存新檔 路徑中。最終的目的地已知之後使用 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);
    			//Note: Exception.Message returns detailed message that describes the current exception. 
    			//For security reasons, we do not recommend you return Exception.Message to end users in 
    			//production environments. It would be better just to put a generic error 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 檔案總管開啟例項,然後找出 [資料] 目錄。
  7. 請確認檔案已被上載到 [資料目錄。

上載較大的檔案

預設情況下,ASP.NET 只允許 4,096 KB 為單位的檔案 (KB)] (或 4 MB) 或更少上載至 Web 伺服器。若要上載較大的檔案,您必須變更 <httpruntime>maxRequestLength 參數 Web.config 檔中的區段。

附註maxRequestLength 屬性已設定 Machine.config 檔中,而且再要求張貼 (如範例為上載檔案),超過 maxRequestLength 的值,無法顯示自訂錯誤網頁。而是,Microsoft Internet Explorer 會顯示 「 找不到伺服器或 DNS 」 錯誤訊息。

如果您想要變更此設定為所有電腦,不只是這個 ASP.NET 應用程式,您必須修改 [Machine.config 檔。

根據預設 <httpruntime> 項目被設定為下列的參數在 Machine.config 中的檔案:
<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);
					//Note: Exception.Message returns a detailed message that describes the current exception. 
					//For security reasons, we do not recommend that you return Exception.Message to end users in 
					//production environments. It would be better to return a generic error message. 
				}
			}
			else
			{
				Response.Write("Please select a file to upload.");
			}
		}
	}
}
	

其他相關資訊

理論上,檔案上載大小上限是相當大。 不過,因為的 ASP.NET 健康監視您無法上載非常大的檔案,在 ASP.NET 中。ASP.NET 背景工作處理序有 2 GB 的虛擬位址空間。不過,ASP.NET 背景工作處理序只會使用稍微多個 1 GB 因為健康監視及記憶體分散程度。

上載過程 ASP.NET 載入記憶體中的整個檔案之前,使用者可以將檔案儲存到磁碟。因此,處理程序可能會因為 memoryLimit 屬性 processModel 標記 Machine.config 檔中的回收。memoryLimit 屬性指定處理程序不會自動回收之前,可以耗盡 ASP.NET 背景工作處理序的實體記憶體的百分比。回收可防止記憶體遺漏 (Memory Leak) 造成 ASP.NET 損毀,或停止回應。

此外,其他因素會扮演的角色可上載的最大檔案大小。這些因素包括可用的記憶體、 可用硬碟空間、 處理器速度及目前的網路流量。正在上載檔案的一般流量,Microsoft 建議您在 10 到 20 百萬位元組 (MB) 的範圍中使用最大檔案大小。如果您很少上載檔案,最大檔案大小可能是 100 MB。

附註您可以上載大於 100 MB,在 ASP.NET 中的檔案。 不過,Microsoft 建議您依照本文所提的最大的檔案上載大小。若要判斷更精確的檔案大小,執行壓力測試相似於將用於實際執行的電腦上。

如果您在檔案上載過程中遇到檔案大小限制,您可能會注意到下列的錯誤訊息:
  • 無法顯示網頁。
  • 伺服器應用程式是無法使用
    在事件] 記錄檔錯誤訊息會類似下列:

    aspnet_wp.exe (PID: PIDNumber) 已經回收,因為記憶體耗用量超過 SizeLimit MB (Percentage 的可用 RAM 百分比)。

  • 型別的 System.OutOfMemoryException 擲回例外狀況。
您也可能會發現上載會發生速度非常緩慢。如果您觀察 Aspnet_wp.exe 處理序在 [Windows 工作管理員] 中,您會注意到記憶體 Delta 改變由 64 KB 每隔 1 到 2 秒。視檔案的大小,此延遲可能會導致 ASP.NET 工作者處理程序回收 responseDeadlock 發生錯誤。

?考

如需詳細資訊造訪下列 Microsoft 開發人員網路 (MSDN) 網站;
<httpruntime>項目
http://msdn2.microsoft.com/en-us/library/e1f13641(vs.71).aspx

輸入的項目 | 輸入的物件
http://msdn.microsoft.com/en-us/library/ms535260(VS.85).aspx

ENCTYPE 屬性 | 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.11
這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 標準版
關鍵字:?
kbmt kbhowtomaster KB323246 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:323246
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