ASP.NET實現檔案的上傳和下載
最近做的一個高校網站中涉及到了上傳和下載檔案的需求(具體需求為:網站公佈的通知,在後臺要能給每個通知新增附件,在前臺要能顯示並下載附件),之前只是學習過關於上傳的 理論知識,這裡實踐了一下下,與大家分享一下成果。
事先說明:這個例子採用的是簡單的三層結構,層與層之間是用實體來傳值。而且這種方法不但在本地測試時可以成功,並且可以部署在伺服器上,供異地上傳和下載檔案。
專門做了一個數據庫表用來儲存附件的相關資訊:
欄位 | 說明 |
AnnexID | 附件ID |
AnnexName | 附件名稱 |
AnnexAddress | 儲存附件的地址 |
NoticeID | 附件所屬“通知”的ID |
ASP.NET實現上傳檔案
前端
介面十分簡單,只是放一個file型別的<input>和一個按鈕,並且為這個按鈕新增點選事件(btnUpLoad_Click),如下圖:
程式碼:
<input id="UpLoad" type="file" runat="server" />
<asp:Button runat="server" Text="上傳" ID="btnUpLoad" OnClick="btnUpLoad_Click" />
後臺
再就是在後臺編寫上傳按鈕點選事件UpLoad_Click裡的程式碼,先大體說一下思路:
1、根據file型別的<input>控制元件獲得將要上傳檔案在本機的物理路徑;
2、在這個物理路徑中用擷取字串的方法獲得檔名(第一步中取得的路徑為本機的絕對路徑,在伺服器上是無效的,所以這裡我們只需要獲取檔名);
3、利用file型別的<input>控制元件屬性PostedFile的SaveAs()方法將相應檔案儲存到伺服器中指定的資料夾中。
核心程式碼:
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") { //將檔案儲存在伺服器中根目錄下的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>
後臺
using System.IO;
protected void lbtnDownLoad_Command(object sender, CommandEventArgs e)
{
// 定義檔名
string fileName = "";
// 獲取檔案在伺服器的地址
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指示客戶端重定向是否是完全限定的,或者指示是否代之以將相對重定向傳送到客戶端。
到這裡就大功告成了,歡迎分享更好的方法!