熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET 2.0高級控件之FileUpload控件

2013-11-13 10:24:53  來源: .NET編程 
應用程序中經常需要允許用戶把文件上傳到web服務器盡管在ASPNET X也可以完成該功能但在ASPNET 中使用FileUpload控件會更簡單

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

  除了從WebControl類繼承的標准成員FileUpload控件還公開了幾個只讀的屬性在表和表列出

  表 FileUpload控件屬性

名  稱 類型 讀 寫 說  明 FileContent Stream × 返回一個指向上傳文件的流對象 FileName string × 返回要上傳文件的名稱不包含路徑信息 HasFile Boolean × 如果是true則表示該控件有文件要上傳 PostedFile HttpPostedFile × 返回已經上傳文件的引用列出了它所公開的只讀屬性
  表 HttpPostedFile屬性

名  稱 類  型 讀 寫 說  明 ContentLength integer × 返回上傳文件的按字節表示的文件大小 ContentType string × 返回上傳文件的MIME內容類型 FileName string × 返回文件在客戶端的完全限定名 InputStream Stream × 返回一個指向上傳文件的流對象
  所有這些屬性將在下面的示例中說明

  為了查看FileUpload控件在實際中的運用創建一個FileUploadDemo網站在頁面上添加一個FileUpload控件然後添加兩個ASPNET按鈕Text屬性分別設置為Save和DisplayID分別設置為btnSave和btnDisplay增加兩個Label控件並分別將ID設置為lblMesage和lblDisplay用<br/>HTML元素分隔這些控件切換到設計視圖通過雙擊每個按鈕為它們在代碼隱藏文件中創建具有默認名稱的Click事件處理程序完成後的內容文件類似於示例

  示例FileUploadDemo網站的defaultaspx

<%@ Page Language=C# AutoEventWireup=true CodeFile=Defaultaspxcs Inherits=_Default %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML //EN
<html xmlns=
<head runat=server
 <title>FileUpload Control</title>
</head>

<body>
 <form id=form runat=server
 <div>
  <h>FileUpload Control</h
  <asp:FileUpload ID=FileUpload 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>

  在代碼隱藏文件中添加示例中高亮顯示的代碼非高亮顯示的代碼由VS自動創建

  示例FileUploadDemo網站的Defaultaspxcs

using System;
using SystemData;
using SystemConfiguration;
using SystemWeb;
using SystemWebSecurity;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIWebControlsWebParts;
using SystemWebUIHtmlControls;
using SystemIO; // 使用Stream必需

public partial class _Default : SystemWebUIPage
{
 protected void Page_Load(object sender EventArgs e)
 {}
 protected void btnSave_Click(object sender EventArgs e)
 {
  string str = ;
  if (FileUploadHasFile)
  {
   try
   {
    str += Uploading file: + FileUploadFileName;
    // 保存文件
    FileUploadSaveAs(c:\\websites\\uploads\\ + FileUploadFileName);
    // 顯示文件信息
    str += <br/>Saved As: + FileUploadPostedFileFileName;
    str += <br/>File Type: + FileUploadPostedFileContentType;
    str += <br/>File Length (bytes): + FileUploadPostedFileContentLength;
    str += <br/>PostedFile File Name: + FileUploadPostedFileFileName;
   }
   catch (Exception ex)
   {
    str += <br/><b>Error</b><br/>Unable to save
c:\\websites\\uploads\\ + FileUploadFileName +<br/> + exMessage;
   }
  }
  else
  {
   str = No file uploaded;
  }
  lblMessageText = str;
  lblDisplayText = ;
 }

 protected void btnDisplay_Click(object sender EventArgs e)
 {
  string str = <u>File: + FileUploadFileName + </u><br/>;
  if (FileUploadHasFile)
  {
   try
   {
    Stream stream = FileUploadFileContent;
    StreamReader reader = new StreamReader(stream);
    string strLine = ;
    do
    {
     strLine = readerReadLine( );
     str += strLine;
    } while (strLine != null);
   }
   catch (Exception ex)
   {
    str += <br/><b>Error</b><br/>Unable to display + FileUploadFileName +
<br/> + exMessage;
   }
  }
  else
  {
   str = No file uploaded;
  }
  lblDisplayText = str;
  lblMessageText = ;
 }
}
  高亮顯示的using聲明對於不使用完全限定命名空間而使用Stream對象是必須的

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

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

  如果SaveAs方法失敗則執行catch代碼塊在lblMessage中顯示一個錯誤信息包括該異常的Message屬性exMessage

  如果SaveAs方法執行成功關於上傳文件的多個信息將顯示在lblMessage中這些信息通過FileUploadPostedFile(類型為HttpPostedFile)中的屬性獲取

  Display按鈕的Click事件處理程序與前面的類似只不過它不是顯示文件信息而是顯示文件內容它通過使用FileContent屬性獲取表現為Stream對象的上傳文件的內容然後這個Stream對象被用於實例化一個StreamReader對象StreamReader的Read Line方法逐行的遍歷文件然後把合並後的字符串顯示在lblDisplay中

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

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

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

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

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


From:http://tw.wingwit.com/Article/program/net/201311/13538.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.