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

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

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

字段 说明
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>

后台

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指示客户端重定向是否是完全限定的,或者指示是否代之以将相对重定向发送到客户端。

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

ASP.NET实现文件的上传和下载相关推荐

  1. SpringMVC实现文件的上传和下载

    SpringMVC实现文件的上传和下载http://www.bieryun.com/1120.html 前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的 ...

  2. Akka实战:HTTP大文件断点上传、下载,秒传

    2019独角兽企业重金招聘Python工程师标准>>> 访问:https://github.com/yangbajing/scala-applications/tree/master ...

  3. 初学Java Web(7)——文件的上传和下载

    文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...

  4. SpringMVC实现文件的上传与下载

    文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考.这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出.最后会把 ...

  5. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  6. FastDFS:Java客户都实现文件的上传、下载、修改、删除

    FastDFS:Java客户都实现文件的上传.下载.修改.删除 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  7. 文件的上传和下载---学习笔记

    文件上传原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的. JSP中上传文 ...

  8. jsp+servlet实现文件的上传和下载

    实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载: (1):上传文件是上传到服务器上,而保存到数据库是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): ...

  9. SpringMVC与JSON传值,取值,使用SpringMVC实现文件的上传与下载,SpringMVC拦截器

    一. JSON 1.1 什么是JSON 在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等: JSON(JavaScript Object Notation:JavaSc ...

最新文章

  1. 不要争了,别的程序员是这么给变量起名的!
  2. XFire报错:org.codehaus.xfire.fault.XFireFault
  3. GEO2R/GEOquery的结果可能是错的!!!
  4. Java NIO入门
  5. HashTable VS Dictionary
  6. 云计算机房设备清单报价,射阳县高级中学云计算机房建设预算.doc
  7. 英语连读 Word Connections
  8. 顺时针、逆时针两种方式减小的倒计时动画
  9. 【★】选择好游戏认准这30个特质!
  10. TCP四次挥手中的2MSL是什么?
  11. 针孔相机模型公式推导
  12. 大厂员工月入6万,居然还不起房贷!
  13. 苹果吃鸡蓝牙耳机推荐哪个?性价比高的游戏蓝牙耳机推荐
  14. 【渗透测试工具beef】XSS渗透测试工具beef如何安装使用?
  15. Verilog 三种计数器写法
  16. Ubuntu或Linux下安装flash插件
  17. 程序员养花几个实用小技巧
  18. 低代码平台的分类及选择参考
  19. 2019年浙江大学计算机考研复试线,2019年浙江大学考研复试分数线已公布
  20. java万年历解析,java万年历

热门文章

  1. MBR-BIOS启动无损转换为UEFI+GPT启动
  2. 算法的力量 ——李开复
  3. Redis 过期Expires
  4. [JZOJ3809]设备塔
  5. windows安装部署hadoop 2.7.7
  6. symbian大事记
  7. android仿支付宝首页更多、应用编辑界面
  8. Axure支付宝首页广告轮播
  9. JUnit单元测试%MODULE_WORKING_DIR%' does not exist
  10. 16_张孝祥_多线程_同步工具CyclicBarrier与CountDownLatch