服務熱線
153 8323 9821
使用 FileUpload 控件,可以為用戶提供一種將文件從其計算機發送到服務器的方法。
一、功能
可使用 FileUpload 控件執行下列操作:
·使用戶能夠上載存儲在服務器上的特定位置的文件。
·限制可上載的文件的大小。
·在存儲上載的文件之前檢查其屬性。
二、背景
FileUpload 控件使用戶能夠上載圖片、文本文件或其他文件。FileUpload 控件顯示一個文本框,在此用戶可以鍵入希望上載到服務器的文件的名稱。該控件還顯示一個“瀏覽”按鈕,該按鈕顯示一個文件導航對話框。(顯示的對話框取決于用戶計算機的操作系統。) 出于安全方面的考慮,不能將文件名預加載到 FileUpload 控件中。
1、處理上載的文件
當用戶已選定要上載的文件并提交頁時,該文件將作為請求的一部分上載。文件將被完整地緩存在服務器內存中。文件完成上載后,頁代碼開始運行。
可以通過下面的方式訪問上載的文件:
·作為在 FileUpload 控件的 FileBytes 屬性中公開的字節數組。
·作為在 FileContent 屬性中公開的流。
·作為 PostedFile 屬性中類型 HttpPostedFile 的對象。PostedFile 對象公開一些屬性,如 ContentType 和 ContentLength 屬性,這些屬性為您提供有關上載的文件的信息。
在代碼運行時,可以檢查文件的特征,例如文件的名稱、大小和 MIME 類型,然后可以保存該文件??梢詫⑽募斪髯止潝到M或流來使用。另外,FileUpload 控件和 HttpPostedFile 對象都支持將文件寫入磁盤的 SaveAs 方法。
對所上載文件的保存位置,沒有固有限制。但是,若要保存文件,asp.net 進程必須具有在指定位置創建文件的權限。此外,還可能將應用程序配置為要求使用絕對路徑(而不是相對路徑)來保存文件,這是一種安全措施。如果將 httPRuntime 配置元素的 requireRootedSaveAsPath 屬性設置為 true(默認值),則在保存上載的文件時必須提供絕對路徑。
說明: 可以創建基于應用程序根文件夾的絕對路徑,方法是使用 HttpServerUtility 類的 MapPath 方法,并將表示應用程序根文件夾的顎化符 (~) 傳遞給該方法。
可上載的最大文件的大小取決于 MaxRequestLength 配置設置的值。如果用戶試圖上載大于最大允許值的文件,則上載會失敗。
2、在部分頁更新中使用 FileUpload 控件
FileUpload 控件設計為僅用于回發方案,而不適用于部分頁呈現期間的異步回發方案。當您在 UpdatePanel 控件內部使用 FileUpload 控件時,必須使用作為面板的一個 PostBackTrigger 對象的控件來上載文件。UpdatePanel 控件用于更新頁的選定區域,而不是使用回發來更新整個頁面。
3、安全性和 FileUpload 控件
通過使用 FileUpload 控件,用戶可以上載可能存在惡意的文件,其中包含腳本文件和可執行文件。無法預先限制用戶可以上載的文件。如果希望限制用戶可以上載的文件的類型,則必須在上載文件后檢查文件特征,如文件的文件擴展名和文件的 ContentType 屬性的值。
說明: 在提交頁面之前,可以使用客戶端腳本來檢查用戶在文本框中鍵入的文件名。盡管在客戶端執行文件名檢查會很有用,但這并不能保證用戶無法上載不安全的文件類型,如可執行文件。
三、如何:使用 FileUpload Web 服務器控件上載文件
用 FileUpload Web 服務器控件,您可以向用戶提供一種將文件從其計算機發送到服務器的方法。要上載的文件將在回發期間作為瀏覽器請求的一部分提交給服務器。在文件完成上載后,您可以用代碼管理該文件。
說明: 可上載的最大文件大小取決于 MaxRequestLength 配置設置的值。如果用戶試圖上載超過最大文件大小的文件,上載就會失敗。
1、向頁面添加 FileUpload 控件。
說明: 出于安全方面的考慮,不能將文件名預加載到 FileUpload 控件中。
2、在事件(如該頁的 Load 事件)的處理程序中,執行下面的操作:
·通過測試 FileUpload 控件的 HasFile 屬性,檢查該控件是否有上載的文件。
·檢查該文件的文件名或 MIME 類型以確保用戶已上載了您要接收的文件。若要檢查 MIME 類型,請獲取作為 FileUpload 控件的 PostedFile 屬性公開的 HttpPostedFile 對象。然后,通過查看已發送文件的 ContentType 屬性,就可以獲取該文件的 MIME 類型。
安全說明: 在某些情況下,已上載文件的 MIME 類型可能是偽造的,因此只檢查文件的 MIME 類型不是一種可靠的安全檢查。
·將該文件保存到您指定的位置。您可以調用 HttpPostedFile 對象的 SaveAs 方法。或者,還可以使用 HttpPostedFile 對象的 InputStream 屬性,以字節數組或字節流的形式管理已上載的文件。
下面的示例演示如何使用已上載的文件。該代碼根據允許的文件擴展名的硬編碼列表檢查已上載文件的文件擴展名,并拒絕所有其他類型的文件。然后,將該文件寫入當前網站的 UploadedImages 文件夾中。用已上載文件在客戶端計算機上的文件名保存該文件。由于 HttpPostedFile 對象的 FileName 屬性返回該文件在客戶端計算機上的完整路徑,因此會使用 FileUpload 控件的 FileName 屬性。
安全說明: 請不要向用戶顯示所保存文件的路徑和文件名;這樣做可能會將有用的信息泄露給惡意用戶。
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack)
{
Boolean fileOK = false;
String path = Server.MapPath("~/UploadedImages/");
if (FileUpload1.HasFile)
{
String fileExtension =
System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
String[] allowedExtensions =
{".gif", ".png", ".jpeg", ".jpg"};
for (int i = 0; i < allowedExtensions.Length; i++)
{
if (fileExtension == allowedExtensions[i])
{
fileOK = true;
}
}
}
if (fileOK)
{
try
{
FileUpload1.PostedFile.SaveAs(path
+ FileUpload1.FileName);
Label1.Text = "File uploaded!";
}
catch (Exception ex)
{