Asp.net中關於上傳檔案的各項基本操作

weixin_33858249發表於2017-11-13

在常見的B/S模式下企業級架構中上傳檔案是一個常見業務操作.在.NET 1.1版本是隻有對應的客戶端HTML版本的Input<Type="File">,在.NET2.0版本新增進來了伺服器端的FileUpload控制元件.

其實考慮在設計這個控制元件時為了保證.NET安全機制.預設設定是檔案上傳的大小是2M. 當然可以通過修改系統的Web.Config配置檔案達到4M. 其實相對而言Fileupload是一把雙刃劍.使用時揚長避短是很重要的.

開發者應該瞭解的是,之所以預設的檔案大小上限為4MB,並不是因為當時的設計人員靈光一現,而是為了避免潛在DOS攻擊危險。若是攻擊者提交了一個或多個大檔案,往往會讓伺服器不堪重負。若是使用者上傳的檔案大於4MB,將會得到“Maximum request length exceeded.”異常資訊. 當然這些就涉及到Asp.net平臺下大檔案上傳的問題作為下一節討論並實現. 本章主要實現的是利用Asp.net中FileUpload控制的一些基本操作.

最近裝上VS2010 Beta2版本. NET FrameWork 4.0.(關係不大)試用一下.以下的專案編碼都在該環境下執行.

(A):簡單檔案上傳操作 頁面程式碼:


  1. --前臺一個上傳控制元件  接著是一個上傳按鈕  
  2.  <asp:FileUpload ID="FileUpload5" runat="server" Width="475px"></asp:FileUpload>  
  3.  <asp:Button ID="TestFileType" runat="server" Text="上傳檔案-判斷檔案型別"   
  4.             onclick="TestFileType_Click" OnClientClick="CheckFileType()" ></asp:Button> 

後臺Button時間操作程式碼:


  1. //向伺服器上傳檔案-BasicOperatorDemo(基本操作演示) -最簡單操作  
  2.    //Author:chenkai Date:2009年11月10日14:22:36  
  3.         protected void bt_upload_Click(object sender, EventArgs e)  
  4.         {  
  5.             try {  
  6.                 if (FileUpload1.PostedFile.FileName == "")  
  7.                 {  
  8.                     this.lb_info.Text = "請選擇您要上傳的檔案!";  
  9.                 }  
  10.                 else 
  11.                 {  
  12.                     string filepath = FileUpload1.PostedFile.FileName.ToString();  
  13.                     string filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);  
  14.  
  15.                     string serverpath = HttpContext.Current.Server.MapPath("Images/") + filename;  
  16.                        
  17.                     //儲存到伺服器上   判斷檔案目錄是否存在  
  18.                     if (File.Exists(serverpath))  
  19.                     {  
  20.                         FileUpload1.SaveAs(serverpath);  
  21.                         this.lb_info.Text = "檔案上傳成功!";  
  22.                     }  
  23.                     else 
  24.                     {  
  25.                         //建立儲存目錄  
  26.                         File.Create(serverpath);  
  27.                     }  
  28.                         
  29.                 }  
  30.             }  
  31.             catch (Exception se)  
  32.             {  
  33.                 this.lb_info.Text = "上傳過程發生錯誤!錯誤原因:" + se.ToString();  
  34.             }  
  35.         } 

再次逐步的提高要求: A:限制客戶端上傳檔案的檔案型別. 只能上傳制定的.JPG/.Jpeg/.chm 3種型別的檔案. 客戶端驗證模式:


  1. <Script language="JavaScript" Type="JS/Text">  
  2.         //定義一個客戶端JS函式來判斷上傳檔案的型別 在Button onClintClick事件呼叫  
  3.         function CheckFileType() {  
  4.             //盡然可以直接呼叫伺服器端控制元件  
  5.             var str = document.getElementById("FileUpload5").value;  
  6.             alert(str);  
  7.          var pos = str.lastIndexOf(".");  
  8.          var lastname = str.substring(pos,str.length)    
  9.    
  10.         if (lastname.toLowerCase()!=".jpg" && lastname.toLowerCase()!=".gif")  
  11.          {  
  12.              alert("您上傳的檔案型別為"+lastname+",圖片必須為.jpg,.gif型別");  
  13.              return false;  
  14.          }  
  15.        else   
  16.         {  
  17.              return true;  
  18.         }  
  19.         }  
  20.     </Script> 

上傳制定檔案型別伺服器端驗證模式:


  1. /// <summary>  
  2.         /// 檢測真正的上傳檔案型別資料  
  3.         /// Author:chenkai  Date:2009年11月11日10:44:26  
  4.         /// </summary>  
  5.         public bool CheckClintFileType(FileUpload getfile)  
  6.         {  
  7.             //獲得資料  
  8.             System.IO.FileStream getstream=new FileStream(getfile.FileName,FileMode.Open,FileAccess.Read);  
  9.             System.IO.BinaryReader getreader = new BinaryReader(getstream);  
  10.  
  11.             string fileclass = string.Empty;  
  12.             byte buffer;  
  13.  
  14.             try  
  15.             {  
  16.                 //讀取的檔案流轉化成二進位制檔案  
  17.                 buffer = getreader.ReadByte();  
  18.                 fileclass = buffer.ToString();  
  19.                 //再次疊加 

 


本文轉自chenkaiunion 51CTO部落格,原文連結:http://blog.51cto.com/chenkai/765300


相關文章