1. 程式人生 > >ASP.NET上傳控制元件——FileUpload控制元件和File控制元件

ASP.NET上傳控制元件——FileUpload控制元件和File控制元件

FileUpload控制元件<?XML:NAMESPACE PREFIX = O />

FileUpload Control

應用程式中經常需要允許使用者把檔案上傳到web伺服器。儘管在ASP.NET 1.X也可以完成該功能,但在ASP.NET 2.0中使用FileUpload控制元件會更簡單。

該控制元件讓使用者更容易地瀏覽和選擇用於上傳的檔案,它包含一個瀏覽按鈕和用於輸入檔名的文字框。只要使用者在文字框中輸入了完全限定的檔名,無論是直接輸入或通過瀏覽按鈕選擇,都可以呼叫FileUploadSaveAs方法儲存到磁碟上。

除了從WebControl類繼承的標準成員,FileUpload

控制元件還公開了幾個只讀的屬性,在表5-8和表5-9列出。

5-8FileUpload控制元件屬性

型別

FileContent

Stream

×

返回一個指向上傳檔案的流物件

FileName

string

×

返回要上傳檔案的名稱,不包含路徑資訊

HasFile

Boolean

×

如果是true,則表示該控制元件有檔案要上傳

PostedFile

HttpPostedFile

×

返回已經上傳檔案的引用。表5-9列出了它所公開的只讀屬性

5-9HttpPostedFile屬性

ContentLength

integer

×

返回上傳檔案的按位元組表示的檔案大小

ContentType

string

×

返回上傳檔案的MIME內容型別

FileName

string

×

返回檔案在客戶端的完全限定名

InputStream

Stream

×

返回一個指向上傳檔案的流物件

所有這些屬性將在下面的示例中說明。

為了檢視FileUpload控制元件在實際中的運用,建立一個FileUploadDemo網站。在頁面上新增一個FileUpload控制元件,然後,新增兩個ASP.NET按鈕,Text屬性分別設定為SaveDisplayID分別設定為btnSavebtnDisplay

。增加兩個Label控制元件,並分別將ID設定為lblMesagelblDisplay。用<br/>HTML元素分隔這些控制元件。切換到設計檢視,通過雙擊每個按鈕,為它們在程式碼隱藏檔案中建立具有預設名稱的Click事件處理程式。完成後的內容檔案類似於示例5-11

示例5-11FileUploadDemo網站的default.aspx

<%@ Page Language=”C#” AutoEventWireup=”true”CodeFile=”Default.aspx.cs”

Inherits=”_Default” %>

<!DOCTYPE html PUBLIC “-//W<?XML:NAMESPACE PREFIX = ST1 />3C//DTD XHTML 1.1//EN”

“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head runat=”server”>

<title>FileUpload Control</title>

</head>

<body>

<form id=”form1” runat=”server”>

<div>

<h1>FileUpload Control</h1>

<asp:FileUpload ID=”FileUpload1” runat=”server” />

<br />

<asp:Button ID=”btnSave” runat=”server”

Text=”Save”

OnClick=”btnSave_Click” />

<asp:Button ID=”btnDisplay” runat=”server”

Text=”Display”

OnClick=”btnDisplay_Click” />

<br />

<br />

<asp:Label ID=”lblMessage” runat=”server” />

<asp:Label ID=”lblDisplay” runat=”server” />

</div>

</form>

</body>

</html>

在程式碼隱藏檔案中,新增示例5-12中高亮顯示的程式碼,非高亮顯示的程式碼由VS2005自動建立。

示例5-12FileUploadDemo網站的Default.aspx.cs

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.IO;//使用Stream必需

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

}

protected void btnSave_Click(object sender, EventArgs e)

{

string str = “”;

if (FileUpload1.HasFile)

{

try

{

str += “Uploading file: “ + FileUpload1.FileName;

//儲存檔案

FileUpload1.SaveAs(“c://websites//uploads//” +

FileUpload1.FileName);

//顯示檔案資訊

str += “<br/>Saved As: “ + FileUpload1.PostedFile.FileName;

str += “<br/>File Type: “ +

FileUpload1.PostedFile.ContentType;

str += “<br/>File Length (bytes): “ +

FileUpload1.PostedFile.ContentLength;

str += “<br/>PostedFile File Name: “ +

FileUpload1.PostedFile.FileName;

}

catch (Exception ex)

{

str += “<br/><b>Error</b><br/>Unable to save

c://websites//uploads//” + FileUpload1.FileName +

“<br/>” + ex.Message;

}

}

else

{

str = “No file uploaded.”;

}

lblMessage.Text = str;

lblDisplay.Text = “”;

}

protected void btnDisplay_Click(object sender, EventArgs e)

{

string str = “<u>File:“ + FileUpload1.FileName + “</u><br/>”;

if (FileUpload1.HasFile)

{

try

{

Stream stream = FileUpload1.FileContent;

StreamReader reader = new StreamReader(stream);

string strLine = “”;

do

{

strLine = reader.ReadLine();

str += strLine;

} while (strLine != null);

}

catch (Exception ex)

{

str += “<br/><b>Error</b><br/>Unable to display “ +

FileUpload1.FileName +

“<br/>” + ex.Message;

}

}

else

{

str = “No file uploaded.”;

}

lblDisplay.Text = str;

lblMessage.Text = “”;

}

}

高亮顯示的using宣告對於不使用完全限定名稱空間,而使用Stream物件是必須的。

Save按鈕的btnSave_Click事件處理程式中,FileUpload控制元件的HasFile屬性用於檢測文字框中是否輸入了有效的完全限定檔名。如果文字框為空或輸入的名稱無效,將不會通過檢測,並且lblMessage將顯示“No file upladed”

假定上傳了一個有效檔案,那麼將執行try程式碼塊中的程式碼。關鍵語句是呼叫File- Upload控制元件的SaveAs方法。該方法使用硬編碼路徑和FileName屬性傳遞一個完全限定的檔名。該語句可能會由於各種原因而失敗,包括磁碟空間不足、無效的路徑或安全問題(稍後會有更詳細的說明)。

如果SaveAs方法失敗,則執行catch程式碼塊。在lblMessage中顯示一個錯誤資訊,包括該異常的Message屬性ex.Message

如果SaveAs方法執行成功,關於上傳檔案的多個資訊將顯示在lblMessage中,這些資訊通過FileUpload.PostedFile(型別為HttpPostedFile)中的屬性獲取。

檔案儲存後,頁面看起來類似於圖5-11

Display按鈕的Click事件處理程式與前面的類似,只不過它不是顯示檔案資訊,而是顯示檔案內容。它通過使用FileContent屬性獲取表現為Stream物件的上傳檔案的內容,然後這個Stream物件被用於例項化一個StreamReader物件。StreamReaderRead- Line方法逐行的遍歷檔案,然後把合併後的字串顯示在lblDisplay中。

因為該檔案包含Gettysburg Address,顯示檔案後頁面看起來類似圖5-12

<?XML:NAMESPACE PREFIX = V />

5-11:檔案儲存後的FileUploadDemo

5-12FileUploadDemo顯示一個檔案

當在討論從客戶端上傳檔案到web伺服器時,安全是非常讓人關注的。須注意兩點,首先,使用這種方式會公開web伺服器,從而會有非常大的安全漏洞,為此要特別細心。因為這樣不僅可以上傳病毒,木馬和其他惡意軟體,還會存在客戶端瀏覽web伺服器目

錄結構的危險。因此,應該使用硬編碼目標目錄,至少嚴格限定在哪裡儲存上傳的檔案。

另外,要注意的一點是,允許在磁碟寫檔案所必需的許可權。在開發web應用程式時,一般情況下,開發機器同時也是web伺服器,特別是使用VS2005預設的開發模式。在該模式下使用的是內建的web伺服器,並且不通過IIS訪問網站而是由檔案系統訪問網站。這樣,永遠也不會有許可權問題。

然而,當網站部署到產品伺服器上,且該網站通過IIS和虛擬目錄來訪問時,就會出現問題。這是因為執行ASP.NET的賬戶必須擁有對用於儲存上傳檔案的目錄的寫許可權。在Windows2000/XP中,賬戶的名稱是ASPNET。在Windows Server2003中,寫許可權必須分配給IIS_WPG賬戶組。

利用FileUpload控制元件並結合良好的安全防護,使用者可以把自己的檔案傳送到網站,以豐富網站功能。


HTML控制元件:file的使用

拖一個html控制元件file   field取名為File1,作為伺服器控制元件執行,我做的是上傳圖片在image控制元件中顯示的例子,然後再拖一個button,在button_click事件中寫:  
  private   void   Button1_Click(object   sender,   System.EventArgs   e)  
  {  
  string   fullname   =   this.File1.PostedFile.FileName;  
  string   filename   =   fullname.Substring(fullname.LastIndexOf("//")+1);  
  string   type   =   fullname.Substring(fullname.LastIndexOf(".")+1).ToLower();  
  if   (type=="jpg"||type=="bmp"||type=="gif")  
  {  
  File1.PostedFile.SaveAs(Server.MapPath("up")+"//"+filename);  
  Image1.ImageUrl   =   "up/"+filename;  
  }  
  else  
  {  
  Response.Write("<script   language='javascript'>alert('你選擇了圖片格式錯誤!');</script>");  
  }  
  }