ASP.NET高級控件——FileUpload控件

FileUpload控件

FileUpload Control

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

該控件讓用戶更容易地瀏覽和選擇用於上傳的文件,它包含一個瀏覽按鈕和用於輸入文件名的文本框。只要用戶在文本框中輸入了完全限定的文件名,無論是直接輸入或通過瀏覽按鈕選擇,都可以調用FileUploadSaveAs方法保存到磁盤上。

除了從WebControl類繼承的標準成員,FileUpload控件還公開了幾個只讀的屬性,在表5-8和表5-9列出。

5-8  FileUpload控件屬性

 

類型

 

FileContent

Stream

×

 

返回一個指向上傳文件的流對象

FileName

string

×

 

返回要上傳文件的名稱,不包含路徑信息

HasFile

Boolean

×

 

如果是true,則表示該控件有文件要上傳

PostedFile

HttpPostedFile

×

 

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

5-9  HttpPostedFile屬性

 

 

 

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 “-//W3C//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


 

5-11:文件保存後的FileUploadDemo

 

5-12FileUploadDemo顯示一個文件

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


錄結構的危險。因此,應該使用硬編碼目標目錄,至少嚴格限定在哪裏保存上傳的文件。

另外,要注意的一點是,允許在磁盤寫文件所必需的權限。在開發web應用程序時,一般情況下,開發機器同時也是web服務器,特別是使用VS2005默認的開發模式。在該模式下使用的是內置的web服務器,並且不通過IIS訪問網站而是由文件系統訪問網站。這樣,永遠也不會有權限問題。

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

利用FileUpload控件並結合良好的安全防護,用戶可以把自己的文件傳送到網站,以豐富網站功能。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1430415

 
發佈了5 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章