服務(wù)熱線
153 8323 9821
使用 FileUpload 控件,可以為用戶提供一種將文件從其計(jì)算機(jī)發(fā)送到服務(wù)器的方法。
一、功能
可使用 FileUpload 控件執(zhí)行下列操作:
·使用戶能夠上載存儲(chǔ)在服務(wù)器上的特定位置的文件。
·限制可上載的文件的大小。
·在存儲(chǔ)上載的文件之前檢查其屬性。
二、背景
FileUpload 控件使用戶能夠上載圖片、文本文件或其他文件。FileUpload 控件顯示一個(gè)文本框,在此用戶可以鍵入希望上載到服務(wù)器的文件的名稱。該控件還顯示一個(gè)“瀏覽”按鈕,該按鈕顯示一個(gè)文件導(dǎo)航對(duì)話框。(顯示的對(duì)話框取決于用戶計(jì)算機(jī)的操作系統(tǒng)。) 出于安全方面的考慮,不能將文件名預(yù)加載到 FileUpload 控件中。
1、處理上載的文件
當(dāng)用戶已選定要上載的文件并提交頁時(shí),該文件將作為請(qǐng)求的一部分上載。文件將被完整地緩存在服務(wù)器內(nèi)存中。文件完成上載后,頁代碼開始運(yùn)行。
可以通過下面的方式訪問上載的文件:
·作為在 FileUpload 控件的 FileBytes 屬性中公開的字節(jié)數(shù)組。
·作為在 FileContent 屬性中公開的流。
·作為 PostedFile 屬性中類型 HttpPostedFile 的對(duì)象。PostedFile 對(duì)象公開一些屬性,如 ContentType 和 ContentLength 屬性,這些屬性為您提供有關(guān)上載的文件的信息。
在代碼運(yùn)行時(shí),可以檢查文件的特征,例如文件的名稱、大小和 MIME 類型,然后可以保存該文件??梢詫⑽募?dāng)作字節(jié)數(shù)組或流來使用。另外,F(xiàn)ileUpload 控件和 HttpPostedFile 對(duì)象都支持將文件寫入磁盤的 SaveAs 方法。
對(duì)所上載文件的保存位置,沒有固有限制。但是,若要保存文件,asp.net 進(jìn)程必須具有在指定位置創(chuàng)建文件的權(quán)限。此外,還可能將應(yīng)用程序配置為要求使用絕對(duì)路徑(而不是相對(duì)路徑)來保存文件,這是一種安全措施。如果將 httPRuntime 配置元素的 requireRootedSaveAsPath 屬性設(shè)置為 true(默認(rèn)值),則在保存上載的文件時(shí)必須提供絕對(duì)路徑。
說明: 可以創(chuàng)建基于應(yīng)用程序根文件夾的絕對(duì)路徑,方法是使用 HttpServerUtility 類的 MapPath 方法,并將表示應(yīng)用程序根文件夾的顎化符 (~) 傳遞給該方法。
可上載的最大文件的大小取決于 MaxRequestLength 配置設(shè)置的值。如果用戶試圖上載大于最大允許值的文件,則上載會(huì)失敗。
2、在部分頁更新中使用 FileUpload 控件
FileUpload 控件設(shè)計(jì)為僅用于回發(fā)方案,而不適用于部分頁呈現(xiàn)期間的異步回發(fā)方案。當(dāng)您在 UpdatePanel 控件內(nèi)部使用 FileUpload 控件時(shí),必須使用作為面板的一個(gè) PostBackTrigger 對(duì)象的控件來上載文件。UpdatePanel 控件用于更新頁的選定區(qū)域,而不是使用回發(fā)來更新整個(gè)頁面。
3、安全性和 FileUpload 控件
通過使用 FileUpload 控件,用戶可以上載可能存在惡意的文件,其中包含腳本文件和可執(zhí)行文件。無法預(yù)先限制用戶可以上載的文件。如果希望限制用戶可以上載的文件的類型,則必須在上載文件后檢查文件特征,如文件的文件擴(kuò)展名和文件的 ContentType 屬性的值。
說明: 在提交頁面之前,可以使用客戶端腳本來檢查用戶在文本框中鍵入的文件名。盡管在客戶端執(zhí)行文件名檢查會(huì)很有用,但這并不能保證用戶無法上載不安全的文件類型,如可執(zhí)行文件。
三、如何:使用 FileUpload Web 服務(wù)器控件上載文件
用 FileUpload Web 服務(wù)器控件,您可以向用戶提供一種將文件從其計(jì)算機(jī)發(fā)送到服務(wù)器的方法。要上載的文件將在回發(fā)期間作為瀏覽器請(qǐng)求的一部分提交給服務(wù)器。在文件完成上載后,您可以用代碼管理該文件。
說明: 可上載的最大文件大小取決于 MaxRequestLength 配置設(shè)置的值。如果用戶試圖上載超過最大文件大小的文件,上載就會(huì)失敗。
1、向頁面添加 FileUpload 控件。
說明: 出于安全方面的考慮,不能將文件名預(yù)加載到 FileUpload 控件中。
2、在事件(如該頁的 Load 事件)的處理程序中,執(zhí)行下面的操作:
·通過測(cè)試 FileUpload 控件的 HasFile 屬性,檢查該控件是否有上載的文件。
·檢查該文件的文件名或 MIME 類型以確保用戶已上載了您要接收的文件。若要檢查 MIME 類型,請(qǐng)獲取作為 FileUpload 控件的 PostedFile 屬性公開的 HttpPostedFile 對(duì)象。然后,通過查看已發(fā)送文件的 ContentType 屬性,就可以獲取該文件的 MIME 類型。
安全說明: 在某些情況下,已上載文件的 MIME 類型可能是偽造的,因此只檢查文件的 MIME 類型不是一種可靠的安全檢查。
·將該文件保存到您指定的位置。您可以調(diào)用 HttpPostedFile 對(duì)象的 SaveAs 方法?;蛘?,還可以使用 HttpPostedFile 對(duì)象的 InputStream 屬性,以字節(jié)數(shù)組或字節(jié)流的形式管理已上載的文件。
下面的示例演示如何使用已上載的文件。該代碼根據(jù)允許的文件擴(kuò)展名的硬編碼列表檢查已上載文件的文件擴(kuò)展名,并拒絕所有其他類型的文件。然后,將該文件寫入當(dāng)前網(wǎng)站的 UploadedImages 文件夾中。用已上載文件在客戶端計(jì)算機(jī)上的文件名保存該文件。由于 HttpPostedFile 對(duì)象的 FileName 屬性返回該文件在客戶端計(jì)算機(jī)上的完整路徑,因此會(huì)使用 FileUpload 控件的 FileName 屬性。
安全說明: 請(qǐng)不要向用戶顯示所保存文件的路徑和文件名;這樣做可能會(huì)將有用的信息泄露給惡意用戶。
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)
{