zoukankan      html  css  js  c++  java
  • 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。

            

           到这里就大功告成了,欢迎分享更好的方法!

           

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    struts2 constant详解
    大图片上传(ImageIO,注意有的图片不能上传时因为他是tiff格式)
    Spring提供的iBatis的SqlMap配置
    2013-7-31hibernate二级缓存
    2013-7-30。。。。难得闲
    POI导出大量数据的简单解决方案
    Tomcat优化详细2
    Tomcat优化详细1
    Tomcat优化方案
    java链表实现
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4740524.html
Copyright © 2011-2022 走看看