轉帖|其它|編輯:郝浩|2010-06-03 11:38:59.000|閱讀 1314 次
概述:應用程序中經常需要允許用戶把文件上傳到web服務器。盡管在ASP.NET 1.X也可以完成該功能,但在ASP.NET 2.0中使用FileUpload控件會更簡單。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
應用程序中經常需要允許用戶把文件上傳到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。用
HTML元素分隔這些控件。切換到設計視圖,通過雙擊每個按鈕,為它們在代碼隱藏文件中創建具有默認名稱的Click事件處理程序。完成后的內容文件類似于示例5-11。
示例5-11:FileUploadDemo網站的default.aspx
FileUpload Control
在代碼隱藏文件中,添加示例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:websitesuploads” + FileUpload1.FileName); // 顯示文件信息 str += “ Saved As: “ + FileUpload1.PostedFile.FileName; str += “ File Type: “ + FileUpload1.PostedFile.ContentType; str += “ File Length (bytes): “ + FileUpload1.PostedFile.ContentLength; str += “ PostedFile File Name: “ + FileUpload1.PostedFile.FileName; } catch (Exception ex) { str += “ Error Unable to save c:websitesuploads” + FileUpload1.FileName +“ ” + ex.Message; } } else { str = “No file uploaded.”; } lblMessage.Text = str; lblDisplay.Text = “”; } protected void btnDisplay_Click(object sender, EventArgs e) { string str = “File: “ + FileUpload1.FileName + “ ”; 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 += “ Error Unable to display “ + FileUpload1.FileName + “ ” + 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控件并結合良好的安全防護,用戶可以把自己的文件傳送到網站,以豐富網站功能。
默認情況下,FileUpload控件上傳大小為4096kb,這是用Web.config文件的配置節中的maxRequestLength屬性來設置,如果需要上傳大于4096kb的文件,則需要修改這這一配置.
文件上傳大小不能超過內存大小的60%.這里的60%也是web.config文件的默認配置,配置中的memoryLimit屬性的默認值.雖然可以修改,但是這給服務器帶來的負擔可想而知.建議不要修改此值.
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載