用户操作
[即时聊天] [发私信] [加为好友]
董DavidID:dotnetWalker
50628次访问,排名2144(-2)好友0人,关注者7
台湾微软MVP
dotnetWalker的文章
原创 45 篇
翻译 0 篇
转载 0 篇
评论 51 篇
dotnetWalker的公告

董大伟,微软TechED 2007 讲师,台湾微软MSDN讲座专属讲师,微软最有价值专家(MVP),台湾清华大学自强基金会教育训练中心顾问讲师,Run!PC专栏作者,博硕文化、旗标出版作者,.NET 书籍畅销作者,台湾多家企业、机构之软件技术顾问、教育训练讲师
最近评论
smoily:7下不来了吗?
shijie1983:提供Google排名优化百度排名竞价雅虎排名推广正好学习一下
xqxujun:Silverlight是什么,晕 亚。。。
iChov:MS也搞出这么复杂的东西。。。
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 如何在ASP.NET中下载文件收藏

    新一篇: 如何在ASP.NET中上传文件到数据库 | 旧一篇: 教学影片:如何建立Silveright图示菜单(Silverlight的鼠标事件功能介绍)




      这是笔者常被问到的一个问题,如何通过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当中的文件下载问题。 

    发表于 @ 2007年11月05日 08:49:00|评论(loading...)|编辑

    新一篇: 如何在ASP.NET中上传文件到数据库 | 旧一篇: 教学影片:如何建立Silveright图示菜单(Silverlight的鼠标事件功能介绍)

    评论

    #Zhe 发表于2007-11-05 16:55:07  IP: 222.69.214.*
    但是这样一来,就不能实现断点续传了……
    #pzhuyy 发表于2007-11-06 16:28:56  IP: 219.136.235.*
    厉害.
    #dotnetWalker 发表于2007-11-07 01:19:01  IP: 210.68.1.*
    确实这样一来,就不能实现断点续传,但是由于会有这样需求的档案下载都是动态产生的,几乎每一次都是新的档案,同时也鲜少有大档案,因此还算问题不大
    #fangzhe 发表于2007-11-07 09:21:25  IP: 222.66.175.*
    实现起来非常简单。Request.Headers["Range"]会有个bytes=....-,Response.Write时候利用FileStream.Seek
    不过如此
    #Zhe 发表于2007-11-07 09:23:55  IP: 222.66.175.*
    实现起来非常简单。Request.Headers["Range"]会有个bytes=....-,Response.Write时候利用FileStream.Seek
    不过如此
    #dotnetWalker 发表于2007-11-07 12:59:03  IP: 210.68.1.*
    这个方式似乎也不错,不过似乎只能在该档案确实存在的时候,如果档案是用动态的方式产生的,例如说从后端Server上及时压缩的.zip或.rar档案,因为每一次query时bytes数都不同,因此可能就无法这样作啰?
    #Zhe 发表于2007-11-07 16:30:58  IP: 222.69.213.*
    可以配合“上传到数据库”
    #dotnetWalker 发表于2007-11-07 16:35:07  IP: 210.68.1.*
    的确,谢谢您的分享。
    #myshijieye 发表于2008-05-23 10:15:03  IP: 125.120.5.*
    <li>李践
    <li>李嘉诚
    <li>成功
    <li>李开复
    <li>大学生创业
    <li>大学生
    <li>李开复
    <li>李开复
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © dotnetWalker