本節介紹了ASP.NET 中使用的兩種上傳檔案到網頁的方法。
ASP.NET 包含兩個控制項可以使使用者上傳到網頁伺服器檔案。一旦伺服器接受了上傳的文件數據,那麼應用程式就可以進行保存,進行檢查或忽略它。接下來的控制項允許文件上傳:
HtmlInputFile - HTML 伺服器控制項
FileUpload - ASP.NET 網頁控制項
兩個控制項都允許檔案上傳,但是FileUpload 控制項會自動設定編碼格式,然而HtmlInputFile 控制項並不會如此。
在本指導中,我們將套用FileUpload 控制項。這個控制項允許使用者預覽選擇將要上傳的文件,它提供了一個預覽按鈕和一個可以輸入文件名稱的文字方塊。
一旦使用者在文字方塊中輸入檔案名稱或預覽文件,FileUpload 控制項的SaveAs 方法就會將檔案儲存到硬碟。
FileUpload 的基本語法如下:
<asp:FileUpload ID= "Uploader" runat = "server" />
FileUpload 類別是從WebControl 類別中得出的,而且它繼承了它的所有元素,FileUpload 類別具有以下這些唯讀屬性:
屬性 | 描述 |
---|---|
FileBytes | 傳回一組將要上傳檔案的字節碼 |
FileContent | 傳回將要上傳的的檔案的流對象 |
FileName | 返回將以上傳的檔案名稱 |
HasFile | 判斷控制項是否有檔案需要上傳 |
PostedFile | 傳回一個關於已上傳檔案的參考 |
發佈的檔案以HttpPostedFile 形式的物件進行封裝,這個物件可以透過FileUpload 類別的PostedFile 屬性被存取。
HttpPostedFile 類別具有以下常用的屬性:
屬性 | 描述 |
---|---|
ContentLength | 返回已上傳的檔案的位元組大小 |
ContentT ype | 傳回已上傳的檔案的MIME 類型 |
FileName | 回傳檔案全名 |
InputStream | 傳回將要上傳的的檔案的流對象 |
下面的範例說明了FileUpload 控制項以及它的屬性。這個表格有一個FileUpload 控制項以及一個儲存按鈕和一個真實檔案名稱、類型、長度的標籤控制項。
在設計模式下,表格如下圖所示:
相關文件代碼列示如下:
<body> <form id="form1" runat="server"> <div> <h3> File Upload:</h3> <br /> <asp:FileUpload ID="FileUpload1" runat="server" /> <br /><br /> <asp:Button ID="btnsave" runat="server" onclick="btnsave_Click" Text="Save" /> <br /><br /> <asp:Label ID="lblmessage" runat="server" /> </div> </form></body>
儲存按鈕的程式碼列示如下:
protected void btnsave_Click(object sender, EventArgs e){ StringBuilder sb = new StringBuilder(); if (FileUpload1.HasFile) { try { sb.AppendFormat(" Uploading file: {0}", FileUpload1.FileName); //saving the file FileUpload1.SaveAs("<c:\SaveDirectory>" + FileUpload1.FileName); //Showing the file information sb.AppendFormat("<br/> Save As: {0}", FileUpload1.PostedFile.FileName); sb.AppendFormat("<br/> File type: {0}", FileUpload1.PostedFile.ContentType); sb.AppendFormat("<br/> File length: {0}", FileUpload1.PostedFile.ContentLength); sb.AppendFormat("<br/> File name: {0}", FileUpload1.PostedFile.FileName); }catch (Exception ex) { sb.Append("<br/> Error <br/>"); sb.AppendFormat("Unable to save file <br/> {0}", ex.Message); } } else { lblmessage.Text = sb.ToString(); }}
注意以下問題:
StringBuilder 類別是由System.IO 命名空間產生,所以應該要包含它。
try 和catch 區域是用來捕捉錯誤、顯示錯誤訊息的。