文章編號: 323245 - 上次校閱: 2007年5月21日 - 版次: 5.5

如何在 ASP.NET 中使用 Visual Basic .NET 上載檔案到網頁伺服器

在此頁中

全部展開 | 全部摺疊

結論

本文將逐步告訴您,如何使用 Visual Basic .NET 將檔案上載到網頁伺服器。在本文中,您會建立 ASP.NET 檔案 (WebForm1.aspx) 及其相關程式碼後置檔案 (WebForm1.aspx.vb),將檔案上載到名為 Data 的目錄中。


建立 ASP.NET 應用程式

在 Microsoft Visual Studio .NET 中,請依照這些步驟建立新應用程式,將檔案上載到網頁伺服器:
  1. 啟動 Microsoft Visual Studio .NET。
  2. [檔案] 功能表上,指向 [新增],然後按一下 [專案]
  3. [新增專案] 對話方塊中,按一下 [專案類型] 下的 [Visual Basic 專案],然後按一下 [範本] 下的 [ASP.NET Web 應用程式]
  4. [位置] 方塊中,鍵入 URL 以建立專案。在這個範例中,請鍵入 http://localhost/VBNetUpload,如此會建立 VBNetUpload 的預設專案名稱。請注意,WebForm1.aspx 檔會在 Visual Studio .NET 的 [設計工具] 檢視中載入。

建立 Data 目錄

建立應用程式後,請建立要接受上載檔案的 Data 目錄。建立這個目錄後,也必須為 ASPNET 工作者帳戶設定寫入權限。
  1. 在 Visual Studio .NET 的 [方案總管] 視窗中,用滑鼠右鍵按一下 VBNetUpload,指向 [新增],然後按一下 [新增資料夾]。根據預設,會建立名為 NewFolder1 的新資料夾。
  2. 如果要將資料夾名稱變更為 Data,請用滑鼠右鍵按一下 NewFolder1,按一下 [重新命名],然後鍵入 Data
  3. 啟動 Windows 檔案總管,然後找出在步驟 2 中建立的 Data 檔案系統資料夾。根據預設,這個資料夾位於下列資料夾中:
    C:\Inetpub\wwwroot\VBNetUpload\Data
  4. 如果要變更安全性設定以授與寫入權限給 Data 目錄,請用滑鼠右鍵按一下 Data,然後按一下 [內容]
  5. [Data 內容] 對話方塊中,按一下 [安全性] 索引標籤,然後按一下 [新增]
  6. [選取使用者或群組] 對話方塊中,按一下 [ASPNET] 帳戶,然後按一下 [新增]。按一下 [確定] 以結束 [選取使用者或群組] 對話方塊。
  7. 按一下 aspnet_wp account (computername\ASPNET) 帳戶或「網路服務」帳戶 (如果使用的是 Microsoft Internet Information Services (IIS) 6.0),然後按一下以選取下列權限的 [允許] 核取方塊:
    • 讀取及執行
    • 列出資料夾內容
    • 讀取
    • 寫入

    按一下以清除任何其他 [允許][拒絕] 核取方塊。
  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.vb 程式碼後置檔案

如果要修改 WebForm1.aspx.vb 程式碼後置檔案使其接受上載資料,請依照下列步驟執行:
  1. 按一下 [檢視] 功能表上的 [設計]
  2. 按兩下 [上載]。Visual Studio 會開啟 WebForm1.aspx.vb 程式碼後置檔案,並自動產生下列方法程式碼:
    Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
    
    End Sub
    					
  3. 確認 WebForm1.vb 檔的類別層級有下列程式碼存在:
    Protected WithEvents Submit1 As System.Web.UI.HtmlControls.HtmlInputButton
    Protected WithEvents File1 As System.Web.UI.HtmlControls.HtmlInputFile
    						
    如果此程式碼不存在於檔案中,請將程式碼加入檔案中的下列一行後:
    Inherits System.Web.UI.Page
    					
  4. 找出下列程式碼:
    Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
    					
  5. 按 ENTER 以新增空白行,然後加入下列程式碼?:
    If Not File1.PostedFile Is Nothing And File1.PostedFile.ContentLength > 0 Then
    
    Dim fn As String =                      System.IO.Path.GetFileName(File1.PostedFile.FileName)
    Dim SaveLocation as String = Server.MapPath("Data") & "\" & fn
    Try
       		File1.PostedFile.SaveAs(SaveLocation)
       		Response.Write("The file has been uploaded.")
    Catch Exc As Exception
     	Response.Write("Error: " & Exc.Message)
    End Try
    Else
    Response.Write("Please select a file to upload.")
    End If
    						
    此程式碼會先確認檔案已上載。如果未選取檔案,您會收到 Please select a file to upload (請選取要上載的檔案) 訊息。如果上載了有效的檔案,則會使用 System.IO 命名空間擷取其檔名,並透過 SaveAs 路徑組合其目的地。獲知最終目的地之後,會使用 File1.PostedFile.SaveAs 方法儲存檔案。任何例外狀況均會截獲,並且將例外狀況訊息顯示於螢幕上。
  6. 確認 Submit1 副程式顯示如下:
    Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
    	If Not File1.PostedFile Is Nothing And File1.PostedFile.ContentLength > 0 Then
                Dim fn As String = System.IO.Path.GetFileName(File1.PostedFile.FileName)
                Dim SaveLocation as String = Server.MapPath("Data") & "\" & fn
                Try
                    File1.PostedFile.SaveAs(SaveLocation)
                    Response.Write("The file has been uploaded.")
                Catch Exc As Exception
                    Response.Write("Error: " & Exc.Message)
                End Try
            Else
                Response.Write("Please select a file to upload.")
            End If
    End Sub
    					

測試應用程式

如果要建置 Visual Studio .NET 方案並測試應用程式,請依照下列步驟執行:
  1. [建置] 功能表上,按一下 [建置方案]
  2. 在 [方案總管] 中,用滑鼠右鍵按一下 [WebForm1.aspx],然後按一下 [在瀏覽器中檢視]
  3. WebForm1.aspx 在瀏覽器中開啟後,按一下 [瀏覽]
  4. [選擇檔案] 對話方塊中,選取小於 4 MB 的檔案,然後按一下 [開啟]
  5. 如果要上載檔案,按一下 [上載]。請注意,檔案會上載到網頁伺服器,並且您會收到 The file has been uploaded (檔案已上載) 訊息。
  6. 回到開啟的 Windows 檔案總管例項中,然後找出 Data 目錄。
  7. 確認檔案已上載到 Data 目錄。

上載較大的檔案

根據預設,ASP.NET 只容許上載 4,096 KB (或 4 MB) 或以下的檔案到網頁伺服器中。如果要上載較大的檔案,您必須變更 Web.config 檔中 <httpRuntime> 區段的 maxRequestLength 參數。

注意 當 Machine.config 檔中設定了 maxRequestLength 屬性而後發佈超出 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="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="VBNetUpload.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
  <HEAD>
    <title>WebForm1</title>
    <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
    <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
    <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" enctype="multipart/form-data" method="post" 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.vb

Public Class WebForm1
    Inherits System.Web.UI.Page
    Protected WithEvents File1 As System.Web.UI.HtmlControls.HtmlInputFile
    Protected WithEvents Submit1 As System.Web.UI.HtmlControls.HtmlInputButton

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
    End Sub

    Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick

        If Not File1.PostedFile Is Nothing And File1.PostedFile.ContentLength > 0 Then
            Dim fn As String = System.IO.Path.GetFileName(File1.PostedFile.FileName)
            Dim SaveLocation as String = Server.MapPath("Data") & "\" & fn
            Try
                File1.PostedFile.SaveAs(SaveLocation)
                Response.Write("The file has been uploaded.")
            Catch Exc As Exception
                Response.Write("Error: " & Exc.Message)
            End Try
        Else
            Response.Write("Please select a file to upload.")
        End If

    End Sub
End Class
				

其他相關資訊

理論上,檔案上載大小上限是相當 大的。然而,由於 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 建議您遵循本文中提到的檔案上載大小上限。如果要判斷更精確的檔案大小,請在與實際作業電腦環境類似的電腦上執行壓力測試。

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

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

  • 已傳回類型 System.OutOfMemoryException 的例外狀況。
您也可能發現上載會進行得非常緩慢。如果您在「Windows 工作管理員」中查看 Aspnet_wp.exe 處理序,則會注意到記憶體差異每 1 到 2 秒就有 64 KB 的變更。視檔案大小的不同,這個延遲可能會因 responseDeadlock 錯誤而造成重新使用 ASP.NET 工作者處理序。

?考

如需詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站:
http://msdn2.microsoft.com/en-us/library/e1f13641(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/e1f13641(vs.71).aspx)
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/input.asp (http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/input.asp)
http://msdn2.microsoft.com/en-us/library/ms533745.aspx (http://msdn2.microsoft.com/en-us/library/ms533745.aspx)
http://msdn2.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlinputfile(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlinputfile(vs.71).aspx)
http://msdn2.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlinputfile.postedfile(vs.71).aspx (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIHtmlControlsHtmlInputFileClassPostedFileTopic.asp)

這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
關鍵字:?
kbprogramming kbhowtomaster kbservercontrols KB323245
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
 

文章翻譯