1. 程式人生 > >asp檔案上傳和下載

asp檔案上傳和下載

ASP.NET實現上傳檔案

       前端

       介面十分簡單,只是放一個file型別的<input>和一個按鈕,並且為這個按鈕新增點選事件(btnUpLoad_Click),如下圖:

           

       程式碼:     

 

[html] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片

  1. <input id="UpLoad" type="file" runat="server" />  
  2. <asp:Button runat="server" Text="上傳" ID="btnUpLoad" OnClick="btnUpLoad_Click" />  

 

 

 

       後臺

       再就是在後臺編寫上傳按鈕點選事件UpLoad_Click裡的程式碼,先大體說一下思路:

       1、根據file型別的<input>控制元件獲得將要上傳檔案在本機的物理路徑;

       2、在這個物理路徑中用擷取字串的方法獲得檔名(第一步中取得的路徑為本機的絕對路徑,在伺服器上是無效的,所以這裡我們只需要獲取檔名);

       3、利用file型別的<input>控制元件屬性PostedFile的SaveAs()方法將相應檔案儲存到伺服器中指定的資料夾中。

       核心程式碼:

 

 

 

[csharp] view plain copy 

在CODE上檢視程式碼片派生到我的程式碼片

  1. protected void btnUpLoad_Click(object sender, EventArgs e)  
  2.     {  
  3.         //取出所選檔案的本地路徑  
  4.         string fullFileName = this.UpLoad.PostedFile.FileName;  
  5.         //從路徑中截取出檔名  
  6.         string fileName = fullFileName.Substring(fullFileName.LastIndexOf("\\") + 1);  
  7.         //限定上傳檔案的格式  
  8.         string type = fullFileName.Substring(fullFileName.LastIndexOf(".") + 1);  
  9.         if (type == "doc" || type == "docx" || type == "xls" || type == "xlsx" || type == "ppt" || type == "pptx" || type == "pdf" || type == "jpg" || type == "bmp" || type == "gif" || type == "png" || type == "txt" || type == "zip" || type == "rar")  
  10.         {  
  11.             //將檔案儲存在伺服器中根目錄下的files資料夾中  
  12.             string saveFileName = Server.MapPath("/files") + "\\" + fileName;  
  13.             UpLoad.PostedFile.SaveAs(saveFileName);  
  14.             Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('檔案上傳成功!');</script>");  
  15.   
  16.             //向資料庫中儲存相應通知的附件的目錄  
  17.             BLL.news.InsertAnnexBLL insertAnnex = new BLL.news.InsertAnnexBLL();  
  18.             AnnexEntity annex=new AnnexEntity();     //建立附件的實體  
  19.             annex.AnnexName=fileName;               //附件名  
  20.             annex.AnnexContent=saveFileName;        //附件的儲存路徑  
  21.             annex.NoticeId = noticeId;              //附件所屬“通知”的ID在這裡為已知  
  22.             insertAnnex.InsertAnnex(annex);         //將實體存入資料庫(其實就是講實體的這些屬性insert到資料庫中的過程,具體BLL層和DAL層的程式碼這裡不再多說)  
  23.         }  
  24.         else  
  25.         {  
  26.             Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('請選擇正確的格式');</script>");  
  27.         }  
  28.     }  

 

 

 

 

          ASP.NET實現下載檔案

       上述操作已經可以實現將一個個附件存入資料庫,在資料庫中儲存的情況給大家截了個圖:

            

       下面就要把這些附件在頁面上顯示,頁面顯示效果為:

        

       點選附件,瀏覽器提示下載:

       

 

       前臺:       

       按照需求來說,每則釋出的通知可以包含若干個附件,所一前臺用了repeter控制元件來顯示多個附件:    

       程式碼:

 

[html] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片

  1. <asp:Repeater ID="rptAnnex" runat="server">  
  2.      <ItemTemplate>  
  3.          <%--為repeter新增序號--%>  
  4.          附件:<%#Container.ItemIndex + 1 %>         
  5.          <asp:LinkButton ID="lbtnDownLoad" runat="server" OnCommand="lbtnDownLoad_Command" CommandArgument="<%#((Model.AnnexEntity)Container.DataItem).AnnexContent %>"><%#((Model.AnnexEntity)Container.DataItem).AnnexName %></asp:LinkButton>  
  6.          <br />  
  7.      </ItemTemplate>  
  8.  </asp:Repeater>  

 

 

 

           後臺

       ASP.NET可以採用多種方式下載檔案(詳情可參考《ASP.NET下載檔案的幾種方式》),這裡採用了流式的下載方式(參考文章《Asp.net下載例項》):      

 

[csharp] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片

  1. using System.IO;  
  2.    protected void lbtnDownLoad_Command(object sender, CommandEventArgs e)  
  3.        {  
  4.            // 定義檔名    
  5.            string fileName = "";  
  6.            // 獲取檔案在伺服器的地址    
  7.            string url = e.CommandArgument.ToString();  
  8.   
  9.            // 判斷傳輸地址是否為空    
  10.            if (url == "")  
  11.            {  
  12.                // 提示“該檔案暫不提供下載”    
  13.                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script defer>alert('該檔案暫不提供下載!');</script>");  
  14.                return;  
  15.            }  
  16.            // 判斷獲取的是否為地址,而非檔名    
  17.            if (url.IndexOf("\\") > -1)  
  18.            {  
  19.                // 獲取檔名    
  20.                fileName = url.Substring(url.LastIndexOf("\\") + 1);  
  21.            }  
  22.            else  
  23.            {  
  24.                // url為檔名時,直接獲取檔名    
  25.                fileName = url;  
  26.            }  
  27.            // 以字元流的方式下載檔案    
  28.            FileStream fileStream = new FileStream(@url, FileMode.Open);  
  29.            byte[] bytes = new byte[(int)fileStream.Length];  
  30.            fileStream.Read(bytes, 0, bytes.Length);  
  31.            fileStream.Close();  
  32.            Response.ContentType = "application/octet-stream";  
  33.   
  34.            // 通知瀏覽器下載   
  35.            Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);  
  36.            Response.BinaryWrite(bytes);  
  37.            Response.Flush();  
  38.            Response.End();       
  39.        }  

 

 

          

         控制上傳檔案的大小     

       前面的兩個步驟基本上已經可以實現檔案的上傳和下載,除了這些,還需要控制上傳檔案的大小,預設情況下上傳檔案大小限制為4M,這裡可以在配置檔案web.config中修改,在httpRuntime節點中加入如下屬性即可:    

 

[html] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片

  1. <configuration>  
  2.   <system.web>    
  3.     <httpRuntime executionTimeout="300" maxRequestLength="51200" useFullyQualifiedRedirectUrl="false" />  
  4.   </system.web>  
  5. </configuration>  

        executionTimeout 屬性的值是 ASP.NET 關閉前允許發生的上載秒數,maxRequestLength指限制上傳檔案的大小,useFullyQualifiedRedirectUrl指示客戶端重定向是否是完全限定的,或者指示是否代之以將相對重定向傳送到客戶端。

 

 

 參考:http://blog.csdn.net/huyuyang6688/article/details/40785429