FileUpload 類別會顯示文字方塊控制項和瀏覽按鈕,該控制項和按鈕可允許使用者選取用戶端上的檔案並將其上載至 Web 伺服器。使用者可藉由在控制項的文字方塊中輸入本機電腦上檔案的完整路徑 (例如,C:\MyFiles\TestFile.txt) 來指定要上載的檔案。或者,使用者也可以選取檔案,方法即按一下 [瀏覽] 按鈕,然後在 [選擇檔案] 對話方塊中尋找檔案。
在使用者選取要上載的檔案之後,FileUpload 控制項不會自動將檔案儲存至伺服器。您必須明確地提供控制項或機制,讓使用者送出指定的檔案。例如,您可以提供使用者可按一下以上載檔案的按鈕。您撰寫之用於儲存指定檔案的程式碼應該呼叫 SaveAs 方法,該方法會將檔案的內容儲存至伺服器上指定的路徑。通常,此控制項會呼叫在引發回傳至伺服器的事件之事件處理方法中的 SaveAs 方法。例如,如果您提供送出檔案的按鈕,則可以將儲存檔案的程式碼包含在按一下事件的事件處理方法中。
在呼叫 SaveAs 方法以將檔案儲存至伺服器之前,請使用 HasFile 屬性以驗證 FileUpload 控制項是否包含檔案。如果 HasFile 傳回 true,則呼叫 SaveAs 方法。如果它傳回 false,則會對使用者顯示一則訊息,表示控制項不包含檔案。不要檢查 PostedFile 屬性來判斷要上載的檔案是否存在,因為根據預設,這個屬性包含 0 個位元組。因此,即使 FileUpload 控制項為空白,PostedFile 屬性也會傳回非 null 值。
當您呼叫 SaveAs 方法時,必須指定要儲存上載的檔案之目錄的完整路徑。如果您未在應用程式程式碼中明確指定路徑,則當使用者嘗試上載檔案時,會擲回例外狀況。這個行為有助於保護伺服器上檔案的安全,方法是阻止使用者寫入至您的應用程式之目錄結構的任意位置,以及阻止對敏感根目錄的存取。
SaveAs 方法會將上載的檔案寫入至指定的目錄。因此,ASP.NET 應用程式必須具有伺服器上目錄的寫入權限。應用程式取得寫入權限的方式有兩種:您可以明確將寫入權限授與應用程式執行時所用的帳戶 (在要儲存上載之檔案的目錄中)。或者,您可以增加授與 ASP.NET 應用程式的信任層級。若要取得對應用程式之執行中目錄的寫入權限,必須將信任層級設定為 AspNetHostingPermissionLevel..::.Medium 值的 AspNetHostingPermission 物件授與應用程式。增加信任層級會增加應用程式對伺服器上資源的存取權限。請注意,這不是安全的方法,因為可控制應用程式的惡意使用者也可以在這個較高的信任層級下執行。最佳作法是在具有執行應用程式所需的最少權限之使用者的內容中執行 ASP.NET 應用程式。如需 ASP.NET 應用程式中安全性的詳細資訊,請參閱 Web 應用程式的基本安全性實行方式 和 ASP.NET 信任層級和原則檔。
FileName 屬性可以用於取得用戶端上使用 FileUpload 控制項上載之檔案的名稱。這個屬性傳回的檔名不會包含用戶端上檔案的路徑。
FileContent 屬性會取得指向要上載之檔案的 Stream 物件。這個屬性可以用於存取檔案的內容 (做為位元組)。例如,您可以使用 FileContent 屬性傳回的 Stream 物件,將檔案的內容做為位元組進行讀取並將其以位元組陣列儲存。或者,您可以使用 FileBytes 屬性來擷取檔案中的所有位元組。
PostedFile 屬性會取得要上載之檔案的基礎 HttpPostedFile 物件。您可以使用這個屬性來存取檔案上的其他屬性。ContentLength 屬性會取得檔案的長度。ContentType 屬性會取得檔案的 MIME 內容類型。此外,您可以使用 PostedFile 屬性來存取 FileName 屬性、InputStream 屬性和 SaveAs 方法。但是,FileName 屬性、FileContent 屬性和 SaveAs 方法也提供相同的功能。
防止服務拒絕攻擊的一種方法是限制可以使用 FileUpload 控制項上載的檔案大小。您應該設定與要上載之檔案類型相符的大小限制。預設大小限制是 4096 KB 或 4 MB。藉由設定 httpRuntime 項目的 maxRequestLength 屬性,您可以允許上載更大的檔案。若要增加整個應用程式允許的最大檔案大小,請設定 Web.config 檔案中的 maxRequestLength 屬性。若要增加指定之頁面允許的最大檔案大小,請設定 Web.config 中 location 項目內的 maxRequestLength 屬性。如需範例,請參閱location 項目 (ASP.NET 設定結構描述)。
上載大型檔案時,使用者也可能會接收下列錯誤訊息:
aspnet_wp.exe (PID: 1520) was recycled because memory consumption exceeded 460 MB (60 percent of available RAM).
如果您的使用者遇到這個錯誤訊息,請增加應用程式的 Web.config 檔之 processModel 項目中的 memoryLimit 屬性值。memoryLimit 屬性會指定工作者處理序可以使用的記憶體最大數量。如果工作者處理序超過 memoryLimit 數量,則會建立新的處理序取代它,且所有目前要求都會重新指派至新的處理序。
若要控制當處理要求時要上載的檔案是暫時儲存在記憶體中還是伺服器上,請設定 httpRuntime 項目的 requestLengthDiskThreshold 屬性。這個屬性可讓您管理輸入資料流緩衝區的大小。預設值為 256 個位元組。您指定的值不應超過為 maxRequestLength 屬性指定的值。