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>
后台
ASP.NET可以采用多種方式下載文件(詳情可參考《ASP.NET下載文件的幾種方式》),這里采用了流式的下載方式(參考文章《Asp.net下載實例》):
- 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指示客戶端重定向是否是完全限定的,或者指示是否代之以將相對重定向發送到客戶端。
參考:http://blog.csdn.net/huyuyang6688/article/details/40785429