ASP.NET文件上传和下载
? ?
? ? ? ?大學(xué)最近作出相關(guān)的需求進(jìn)行上傳和下載文件的網(wǎng)站(求為:站點(diǎn)發(fā)布的通知,在后臺(tái)要能給每一個(gè)通知加入附件。在前臺(tái)要能顯示并下載附件),之前僅僅是學(xué)習(xí)過關(guān)于上傳的 理論知識(shí),這里實(shí)踐了一下下,與大家分享一下成果。
? ? ? ?事先說明:這個(gè)樣例採用的是簡(jiǎn)單的三層結(jié)構(gòu),層與層之間是用實(shí)體來傳值。
并且這樣的方法不但在本地測(cè)試時(shí)能夠成功,并且能夠部署在server上,供異地上傳和下載文件。
? ? ? ?專門做了一個(gè)數(shù)據(jù)庫表用來存儲(chǔ)附件的相關(guān)信息:??
| 字段 | 說明 |
| AnnexID | 附件ID |
| AnnexName | 附件名稱 |
| AnnexAddress | 存儲(chǔ)附件的地址 |
| NoticeID | 附件所屬“通知”的ID |
? ? ? ?ASP.NET實(shí)現(xiàn)上傳文件
? ? ? ?前端
? ? ? ?界面十分簡(jiǎn)單。僅僅是放一個(gè)file類型的<input>和一個(gè)button,而且為這個(gè)button加入點(diǎn)擊事件(btnUpLoad_Click),例如以下圖:
? ? ? ? ? ?
? ? ? ?代碼:? ? ?
<input id="UpLoad" type="file" runat="server" /><asp:Button runat="server" Text="上傳" ID="btnUpLoad" OnClick="btnUpLoad_Click" />
? ? ? ?后臺(tái)
? ? ? ?再就是在后臺(tái)編寫上傳button點(diǎn)擊事件UpLoad_Click里的代碼,先大體說一下思路:
? ? ? ?1、依據(jù)file類型的<input>控件獲得將要上傳文件在本機(jī)的物理路徑。
? ? ? ?2、在這個(gè)物理路徑中用截取字符串的方法獲得文件名稱(第一步中取得的路徑為本機(jī)的絕對(duì)路徑,在server上是無效的,所以這里我們僅僅須要獲取文件名稱)。
? ? ? ?3、利用file類型的<input>控件屬性PostedFile的SaveAs()方法將對(duì)應(yīng)文件存儲(chǔ)到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>");//向數(shù)據(jù)庫中存儲(chǔ)對(duì)應(yīng)通知的附件的文件夾BLL.news.InsertAnnexBLL insertAnnex = new BLL.news.InsertAnnexBLL();AnnexEntity annex=new AnnexEntity(); //創(chuàng)建附件的實(shí)體annex.AnnexName=fileName; //附件名annex.AnnexContent=saveFileName; //附件的存儲(chǔ)路徑annex.NoticeId = noticeId; //附件所屬“通知”的ID在這里為已知insertAnnex.InsertAnnex(annex); //將實(shí)體存入數(shù)據(jù)庫(事實(shí)上就是講實(shí)體的這些屬性insert到數(shù)據(jù)庫中的過程。詳細(xì)BLL層和DAL層的代碼這里不再多說)}else{Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('請(qǐng)選擇正確的格式');</script>");}}
? ? ? ? ??ASP.NET實(shí)現(xiàn)下載文件
? ? ? ?上述操作已經(jīng)能夠?qū)崿F(xiàn)將一個(gè)個(gè)附件存入數(shù)據(jù)庫,在數(shù)據(jù)庫中存儲(chǔ)的情況給大家截了個(gè)圖:
? ? ? ? ? ??
? ? ? ?以下就要把這些附件在頁面上顯示,頁面顯示效果為:
? ? ? ??
? ? ? ?點(diǎn)擊附件,瀏覽器提示下載:
? ? ? ?
?
? ? ? ?前臺(tái): ? ? ??
? ? ? ?依照需求來說,每則公布的通知能夠包括若干個(gè)附件,所一前臺(tái)用了repeter控件來顯示多個(gè)附件: ? ?
? ? ? ?代碼:
<asp:Repeater ID="rptAnnex" runat="server"><ItemTemplate><%--為repeter加入序號(hào)--%>附件:<%#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下載實(shí)例》):? ? ??
using System.IO;protected void lbtnDownLoad_Command(object sender, CommandEventArgs e){// 定義文件名稱 string fileName = "";// 獲取文件在server的地址 string url = e.CommandArgument.ToString();// 推斷傳輸?shù)刂肥欠駷榭? 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為文件名稱時(shí),直接獲取文件名稱 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(); }
? ? ? ? ??
? ? ? ? ?控制上傳文件的大小??? ?
? ? ? ?前面的兩個(gè)步驟基本上已經(jīng)能夠?qū)崿F(xiàn)文件的上傳和下載。除了這些,還須要控制上傳文件的大小,默認(rèn)情況下上傳文件限制大小為4M,這里能夠在配置文件web.config中改動(dòng),在httpRuntime節(jié)點(diǎn)中增加例如以下屬性就可以:? ??
<configuration><system.web> <httpRuntime executionTimeout="300" maxRequestLength="51200" useFullyQualifiedRedirectUrl="false" /></system.web> </configuration>? ? ? ??executionTimeout 屬性的值是 ASP.NET 關(guān)閉前同意發(fā)生的上載秒數(shù),maxRequestLength指限制上傳文件的大小,useFullyQualifiedRedirectUrl指示client重定向是否是全然限定的,或者指示是否代之以將相對(duì)重定向發(fā)送到client。
? ? ? ??
? ? ? ?到這里就大功告成了,歡迎分享更好的方法!
? ? ? ?
版權(quán)聲明:本文博客原創(chuàng)文章。博客,未經(jīng)同意,不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的ASP.NET文件上传和下载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GIT子模块的使用
- 下一篇: 数据解析1:XML解析(2)