ASP.NET文件上传和下载
? ?
? ? ? ?大學最近作出相關的需求進行上傳和下載文件的網站(求為:站點發布的通知,在后臺要能給每一個通知加入附件。在前臺要能顯示并下載附件),之前僅僅是學習過關于上傳的 理論知識,這里實踐了一下下,與大家分享一下成果。
? ? ? ?事先說明:這個樣例採用的是簡單的三層結構,層與層之間是用實體來傳值。
并且這樣的方法不但在本地測試時能夠成功,并且能夠部署在server上,供異地上傳和下載文件。
? ? ? ?專門做了一個數據庫表用來存儲附件的相關信息:??
| 字段 | 說明 |
| AnnexID | 附件ID |
| AnnexName | 附件名稱 |
| AnnexAddress | 存儲附件的地址 |
| NoticeID | 附件所屬“通知”的ID |
? ? ? ?ASP.NET實現上傳文件
? ? ? ?前端
? ? ? ?界面十分簡單。僅僅是放一個file類型的<input>和一個button,而且為這個button加入點擊事件(btnUpLoad_Click),例如以下圖:
? ? ? ? ? ?
? ? ? ?代碼:? ? ?
<input id="UpLoad" type="file" runat="server" /><asp:Button runat="server" Text="上傳" ID="btnUpLoad" OnClick="btnUpLoad_Click" />
? ? ? ?后臺
? ? ? ?再就是在后臺編寫上傳button點擊事件UpLoad_Click里的代碼,先大體說一下思路:
? ? ? ?1、依據file類型的<input>控件獲得將要上傳文件在本機的物理路徑。
? ? ? ?2、在這個物理路徑中用截取字符串的方法獲得文件名稱(第一步中取得的路徑為本機的絕對路徑,在server上是無效的,所以這里我們僅僅須要獲取文件名稱)。
? ? ? ?3、利用file類型的<input>控件屬性PostedFile的SaveAs()方法將對應文件存儲到server中指定的目錄中。
? ? ? ?核心代碼:
protected void btnUpLoad_Click(object sender, EventArgs e){//取出所選文件的本地路徑string fullFileName = this.UpLoad.PostedFile.FileName;//從路徑中截取出文件名稱string fileName = fullFileName.Substring(fullFileName.LastIndexOf("\\") + 1);//限定上傳文件的格式string type = fullFileName.Substring(fullFileName.LastIndexOf(".") + 1);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"){//將文件保存在server中根文件夾下的files文件夾中string saveFileName = Server.MapPath("/files") + "\\" + fileName;UpLoad.PostedFile.SaveAs(saveFileName);Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('文件上傳成功。');</script>");//向數據庫中存儲對應通知的附件的文件夾BLL.news.InsertAnnexBLL insertAnnex = new BLL.news.InsertAnnexBLL();AnnexEntity annex=new AnnexEntity(); //創建附件的實體annex.AnnexName=fileName; //附件名annex.AnnexContent=saveFileName; //附件的存儲路徑annex.NoticeId = noticeId; //附件所屬“通知”的ID在這里為已知insertAnnex.InsertAnnex(annex); //將實體存入數據庫(事實上就是講實體的這些屬性insert到數據庫中的過程。詳細BLL層和DAL層的代碼這里不再多說)}else{Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('請選擇正確的格式');</script>");}}
? ? ? ? ??ASP.NET實現下載文件
? ? ? ?上述操作已經能夠實現將一個個附件存入數據庫,在數據庫中存儲的情況給大家截了個圖:
? ? ? ? ? ??
? ? ? ?以下就要把這些附件在頁面上顯示,頁面顯示效果為:
? ? ? ??
? ? ? ?點擊附件,瀏覽器提示下載:
? ? ? ?
?
? ? ? ?前臺: ? ? ??
? ? ? ?依照需求來說,每則公布的通知能夠包括若干個附件,所一前臺用了repeter控件來顯示多個附件: ? ?
? ? ? ?代碼:
<asp:Repeater ID="rptAnnex" runat="server"><ItemTemplate><%--為repeter加入序號--%>附件:<%#Container.ItemIndex + 1 %> <asp:LinkButton ID="lbtnDownLoad" runat="server" OnCommand="lbtnDownLoad_Command" CommandArgument="<%#((Model.AnnexEntity)Container.DataItem).AnnexContent %>"><%#((Model.AnnexEntity)Container.DataItem).AnnexName %></asp:LinkButton><br /></ItemTemplate></asp:Repeater>
? ? ? ?ASP.NET能夠採用多種方式下載文件(詳情可參考《ASP.NET下載文件的幾種方式》),這里採用了流式的下載方式(參考文章《Asp.net下載實例》):? ? ??
using System.IO;protected void lbtnDownLoad_Command(object sender, CommandEventArgs e){// 定義文件名稱 string fileName = "";// 獲取文件在server的地址 string url = e.CommandArgument.ToString();// 推斷傳輸地址是否為空 if (url == ""){// 提示“該文件暫不提供下載” Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script defer>alert('該文件暫不提供下載!
');</script>"); return; } // 推斷獲取的是否為地址。而非文件名稱 if (url.IndexOf("\\") > -1) { // 獲取文件名稱 fileName = url.Substring(url.LastIndexOf("\\") + 1); } else { // url為文件名稱時,直接獲取文件名稱 fileName = url; } // 以字符流的方式下載文件 FileStream fileStream = new FileStream(@url, FileMode.Open); byte[] bytes = new byte[(int)fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileStream.Close(); Response.ContentType = "application/octet-stream"; // 通知瀏覽器下載 Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); Response.BinaryWrite(bytes); Response.Flush(); Response.End(); }
? ? ? ? ??
? ? ? ? ?控制上傳文件的大小??? ?
? ? ? ?前面的兩個步驟基本上已經能夠實現文件的上傳和下載。除了這些,還須要控制上傳文件的大小,默認情況下上傳文件限制大小為4M,這里能夠在配置文件web.config中改動,在httpRuntime節點中增加例如以下屬性就可以:? ??
<configuration><system.web> <httpRuntime executionTimeout="300" maxRequestLength="51200" useFullyQualifiedRedirectUrl="false" /></system.web> </configuration>? ? ? ??executionTimeout 屬性的值是 ASP.NET 關閉前同意發生的上載秒數,maxRequestLength指限制上傳文件的大小,useFullyQualifiedRedirectUrl指示client重定向是否是全然限定的,或者指示是否代之以將相對重定向發送到client。
? ? ? ??
? ? ? ?到這里就大功告成了,歡迎分享更好的方法!
? ? ? ?
版權聲明:本文博客原創文章。博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的ASP.NET文件上传和下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GIT子模块的使用
- 下一篇: Java jvisualvm简要说明