應用程序中經常需要允許用戶把文件上傳到web服務器
盡管在ASP
NET
X也可以完成該功能
但在ASP
NET
中使用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控件
然後
添加兩個ASP
NET按鈕
Text屬性分別設置為Save和Display
ID分別設置為btnSave和btnDisplay
增加兩個Label控件
並分別將ID設置為lblMesage和lblDisplay
用<br/>HTML元素分隔這些控件
切換到設計視圖
通過雙擊每個按鈕
為它們在代碼隱藏文件中創建具有默認名稱的Click事件處理程序
完成後的內容文件類似於示例
示例
FileUploadDemo網站的default
aspx
<%@ Page Language=
C#
AutoEventWireup=
true
CodeFile=
Default
aspx
cs
Inherits=
_Default
%>
<!DOCTYPE html PUBLIC
//W
C//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 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 (FileUpload
HasFile)
{
try
{
str +=
Uploading file:
+ FileUpload
FileName;
// 保存文件
FileUpload
SaveAs(
c:\\websites\\uploads\\
+ FileUpload
FileName);
// 顯示文件信息
str +=
<br/>Saved As:
+ FileUpload
PostedFile
FileName;
str +=
<br/>File Type:
+ FileUpload
PostedFile
ContentType;
str +=
<br/>File Length (bytes):
+ FileUpload
PostedFile
ContentLength;
str +=
<br/>PostedFile File Name:
+ FileUpload
PostedFile
FileName;
}
catch (Exception ex)
{
str +=
<br/><b>Error</b><br/>Unable to save
c:\\websites\\uploads\\
+ FileUpload
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:
+ FileUpload
FileName +
</u><br/>
;
if (FileUpload
HasFile)
{
try
{
Stream stream = FileUpload
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
+ FileUpload
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服務器
特別是使用VS
默認的開發模式
在該模式下使用的是內置的web服務器
並且不通過IIS訪問網站而是由文件系統訪問網站
這樣
永遠也不會有權限問題
然而
當網站部署到產品服務器上
且該網站通過IIS和虛擬目錄來訪問時
就會出現問題
這是因為運行ASP
NET的賬戶必須擁有對用於保存上傳文件的目錄的寫權限
在Windows
/XP中
賬戶的名稱是ASPNET
在Windows Server
中
寫權限必須分配給IIS_WPG賬戶組
利用FileUpload控件並結合良好的安全防護
用戶可以把自己的文件傳送到網站
以豐富網站功能
From:http://tw.wingwit.com/Article/program/net/201311/13538.html