FileUpload控件
FileUpload Control
應用程序中經常需要允許用戶把文件上傳到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)中的屬性獲取。
文件保存後,頁面看起來類似於圖5-11。
Display按鈕的Click事件處理程序與前面的類似,只不過它不是顯示文件信息,而是顯示文件內容。它通過使用FileContent屬性獲取表現爲Stream對象的上傳文件的內容,然後這個Stream對象被用於實例化一個StreamReader對象。StreamReader的Read- Line方法逐行的遍歷文件,然後把合併後的字符串顯示在lblDisplay中。
因爲該文件包含Gettysburg Address,顯示文件後頁面看起來類似圖5-12。
圖5-11:文件保存後的FileUploadDemo
圖5-12:FileUploadDemo顯示一個文件
當在討論從客戶端上傳文件到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