当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 解析:如何在 ASP.NET 中下载文件

ASP.NET
asp.net Server.MapPath方法注意事项
asp.net下常用的加密算法MD5、SHA-1应用代码
几个 ASP.NET 小技巧
ASP.NET内置对象之Application对象
ASP.NET使用正则表达式屏蔽垃圾信息
asp.net“服务器应用程序不可用” 解决方法
asp.net Linq把数据导出到Excel的代码
asp.net ext treepanel 动态加载XML的实现方法
silverlight2.0Beta版TextBox输入中文解决方法
asp.net转出json格式客户端显示时间
asp.net下Linq To Sql注意事项小结
ASP.NET动态加载用户控件的实现方法
asp.net web大文件上传带进度条实例代码
asp.net DZ论坛中根据IP地址取得所在地的代码
向asp.Net进发 数据库连接操作
.net 上传文件前所未有的简单
asp.net gridview代码绑定
asp.net中List的使用方法
Asp.net(C#)实现验证码功能代码
asp.NET开发中正则表达式中BUG分析

解析:如何在 ASP.NET 中下载文件


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 273 ::
收藏到网摘: n/a

  这是笔者常被问到的一个问题,如何通过ASP.NET来下载文件,这个问题可大可小,我们先从小的开始。当我们要让用户下载一个文件,最简单的方式是通过Response.Redirect指令:

  Response.Redirect("test.doc")

  您可以把上面这行指令放在Button的Click事件当中,当用户点击按钮之后,网页就会被转址到该word档,造成下载的效果。

  但是这样的下载有几个问题:

  1. 无法下载不存在的文件:例如,我们若是想把程序动态(临时)产生的文字,当作一个文件下载的时候(也就是该文件其实原先并不是真的存在,而是动态产生的),就无法下载。

  2. 无法下载存储于数据库中的文件:这是类似的问题,该文件并没有真的存在,只是被存放在数据库中的某个位置(某笔记录中的某个栏位)的时候,就无法下载。

  3. 无法下载不存在于Web文件夹中的文件:文件确实存在,但该文件夹并不是可以分享出来的Web文件夹,例如,该文件的位置在C:\winnt,您总不会想要把该文件夹当作Web文件夹吧?这时候,由于您无法使用Redirect指向该位置,所以无法下载。

  4. 下载文件后,原本的页面将会消失。

  典型的状况是,我们要让用户下载一个.txt文件,或是.csv格式的Excel文件,但是...

  1. 这个文件可能是通过ASP.NET程序动态产生的,而不是确实存在于Server端的文件;

  2. 或是它虽然存在于伺服器端的某个实体位置,但我们并不想暴露这个位置(如果这个位置公开,很可能没有权限的用户也可以在网址栏上输入URL直接取得!!!)

  3. 或是这个位置并不在网站虚拟路径所在的文件夹中。(例如C:\Windows\System32...)

  这时候,我们就得采用不同的方式:

  Shared Function DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FileBody As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '文件名称
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '文件内容
  WebForm.Response.Write(FileBody)
  WebForm.Response.End()
  End Function

  上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数:

  Shared Sub DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FilePath As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '文件名称
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '文件内容
  WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath))
  WebForm.Response.End()
  End Sub

  上面这两个下载文件的的函数,应可解决大多数开发人员在ASP.NET当中的文件下载问题。