ASP.NET 2.0進階控制項之FileUpload控制項

來源:互聯網
上載者:User
asp.net|進階|控制項   應用程式中經常需要允許使用者把檔案上傳到web伺服器。儘管在ASP.NET 1.X也可以完成該功能,但在ASP.NET 2.0中使用FileUpload控制項會更簡單。

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

  除了從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屬性分別設定為Save和Display,ID分別設定為btnSave和btnDisplay。增加兩個Label控制項,並分別將ID設定為lblMesage和lblDisplay。用<br/>HTML元素分隔這些控制項。切換到設計檢視,通過雙擊每個按鈕,為它們在程式碼後置檔案中建立具有預設名稱的Click事件處理常式。完成後的內容檔案類似於樣本5-11。

  樣本5-11:FileUploadDemo網站的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-12:FileUploadDemo網站的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)中的屬性擷取。

  Display按鈕的Click事件處理常式與前面的類似,只不過它不是顯示檔案資訊,而是顯示檔案內容。它通過使用FileContent屬性擷取表現為Stream對象的上傳檔案的內容,然後這個Stream對象被用於執行個體化一個StreamReader對象。StreamReader的Read- Line方法逐行的遍曆檔案,然後把合并後的字串顯示在lblDisplay中。

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

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

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

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.