ASP.NET实现文件的上传和下载

简介: 最近做的一个高校网站中涉及到了上传和下载文件的需求(具体需求为:网站公布的通知,在后台要能给每个通知添加附件,在前台要能显示并下载附件),之前只是学习过关于上传的 理论知识,这里实践了一下下,与大家分享一下成果。

      最近做的一个高校网站中涉及到了上传和下载文件的需求(具体需求为:网站公布的通知,在后台要能给每个通知添加附件,在前台要能显示并下载附件),之前只是学习过关于上传的 理论知识,这里实践了一下下,与大家分享一下成果。


      事先说明:这个例子采用的是简单的三层结构,层与层之间是用实体来传值。而且这种方法不但在本地测试时可以成功,并且可以部署在服务器上,供异地上传和下载文件。


      专门做了一个数据库表用来存储附件的相关信息:  


26.png


      ASP.NET实现上传文件


      前端


      界面十分简单,只是放一个file类型的<input>和一个按钮,并且为这个按钮添加点击事件(btnUpLoad_Click),如下图:


27.png

    代码:    

    <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实现下载文件


      上述操作已经可以实现将一个个附件存入数据库,在数据库中存储的情况给大家截了个图:

28.png


    下面就要把这些附件在页面上显示,页面显示效果为:


29.png


      点击附件,浏览器提示下载:

30.png


      前台:      


      按照需求来说,每则发布的通知可以包含若干个附件,所一前台用了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指示客户端重定向是否是完全限定的,或者指示是否代之以将相对重定向发送到客户端。


     


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


相关文章
|
2月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
176 3
|
3月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
142 0
|
6月前
|
存储 XML 开发工具
【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作
本文介绍了如何在Azure上使用App Service作为反向代理,以自定义域名访问Storage Account。主要内容包括: 1. **设置反向代理**:通过配置`applicationhost.xdt`和`web.config`文件,启用IIS代理功能并设置重写规则。 2. **验证访问**:测试原生URL和自定义域名的访问效果,确保两者均可正常访问Storage Account。 3. **.NET SDK连接**:使用共享访问签名(SAS URL)初始化BlobServiceClient对象,实现通过自定义域名访问存储服务。
|
9月前
|
Linux C# Windows
.NET使用MiniWord高效生成Word文件
.NET使用MiniWord高效生成Word文件
225 12
|
10月前
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
516 1
|
11月前
|
存储 开发框架 .NET
Windows IIS中asp的global.asa全局配置文件使用说明
Windows IIS中asp的global.asa全局配置文件使用说明
213 1
.NET 压缩/解压文件
【9月更文挑战第5天】在 .NET 中,可利用 `System.IO.Compression` 命名空间进行文件的压缩与解压。首先引入相关命名空间,然后通过 GZipStream 类实现具体的压缩或解压功能。下面提供了压缩与解压文件的方法示例及调用方式,便于用户快速上手操作。
140 6
|
11月前
|
C# Windows
一款基于.NET开发的简易高效的文件转换器
一款基于.NET开发的简易高效的文件转换器
101 0
|
Java Windows 容器
【应用服务 App Service】快速获取DUMP文件(App Service for Windows(.NET/.NET Core))
【应用服务 App Service】快速获取DUMP文件(App Service for Windows(.NET/.NET Core))
200 4
一款.NET开源、跨平台的DASH/HLS/MSS下载工具
一款.NET开源、跨平台的DASH/HLS/MSS下载工具
121 1