如何在 ASP.NET 中下载文件

来源:互联网 发布:linux 磁盘同步 编辑:程序博客网 时间:2024/06/05 20:39

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

殇﹖ ☆粉汐げ沫沫 №柳絮飘零℡ 忘记 - 國際后爹。 ┌┌賣身 杨易易 丶ㄗìng*` 聖ジゞ心 |▍`縵嗨 ^蓝^幻 ♂演卜莞啲戏 &流浪鱼^ 自由人 Kugoo ●Lzisgod● ″_.淡莣°﹖ ωǒ﹎緈輻? ┆鮳丄嘍┆~~ TAK-AKINA "`.惔莣.à﹖ ..壊尐孓 ゝ尛樂冃學 Lovin U 不想恋爱 ↘*潶Sè 襘 Sminis┆煌 ギ℡娚魜菋メ YGL^o^義 千里快哉风 H^ō^H 开心果 新新 smile~ {→.°難舍` 云翔 -〣ˇ莣誋◆ ╘*.兲使 __. 亡命天涯 ぁ嗳マ♀ヶ乔 ぐo騩贰爺︶ 木時 123?? SOSO用户 天使/ty草鱼 _﹥雙.漁蓙_ 爱袮爬上牆  ゛綪譅﹖ 木時 outsider ℅﹏彎○° ⒓冄23號 ℡誮惢ヾ 〆coooal﹏ ωǒ鈈袙※瀭 ︶ㄣ繌尐孓 老野 _ 蒤鵶.· 冥王の殇烙印 oО啡露⒏娶_ 『ˉ蕗ˉ』 の月ぜ光の SOSO用户 "Xīao┘肖 →習慣有袮ぺ 南無阿彌陀佛 瘋狂的喵喵 佳佳 愛捉弄人D.豬 打死也不能说 [潮濕]。 /ty╲_/~↘ 上帝メ禁區 溈鉨wo乄菰単 摇滚¢堕落 K★T★V★ ←¢幻風☆ ↘静静的。。 ︶ㄣ愛誰誰ㄣ ℉ǒr下午``` ↙℡︱聯盟灬 尐孓/勾贼嘢 我叫什么? ゝ天囿┌藍 『火¤影』暗 喤締√ 高天流云 ぜだ♂ 黑崎一户 ゛-.閉 - 〆宝宝鱼ぐ 尘封记忆 卿松敷任 κ﹏錯〆覺 午后柠檬茶 精灵 日&月 一米阳光 有话直说 麥咯ダ麥﹫ -あXeyuuあ 血龙⑻寒风 随时 々諥キ嚸★← 偉偉/aiq最乖 ︵ShoW躌の帅 o.謊言..╱ 涙_Sky.孤独 影 季 鲈莼思归 あ冰山来客あ 流浪的疾风 ゛從紟暀後ˊ §如梦人生★ (_蒍祢变乖 这一季 八千女鬼 Dongr 阿君/xixin 皒,厛兲甴掵 LOVEの永远 /mg微笑 ジ緣起吥滅ジ 一切皆有可能 商████ 俊 獨行★天下 ご&ァ^╅緣╰ 夏水朦胧 飞雪飘扬 單純哋壞︶ㄣ (_頖縌ゞ尐姊 ㊣西湖づ壟王 愛の無限 '苊祉為尓哭. 喜欢你 ぃ閉幕式íΟ 你的左伴边 妖精鱼儿 ご孤單菋噵ご 喜喜 ﹎亂倫 ɑべ -到此爲止, せね亢吻掂ひ |ミ桖ㄨ際╮ WYAN 懶す喫草つて ▉▉冷血▉▉ 今世無緣 愛伱不是遊戲 ^球園書方か. ылε彬 ぃ旮旮跩う 魔鬼 ヤ吓ωǒ①跳 蓝鱼 蒓べ愛℡﹎嚖 笨毛毛 ●▕謀娚孓" /;f素颜如故 ♀少爺★偉¤ ‘虛僞 ポ岥つ尒さ陔 丅芈zai薆亇 ぐ灬葬︶ㄣ淚 ‘ 牜.Ы !` ら蝳薬ん ℡戀丄妳 玉九易 【禁止騷擾】 ゞ 淚 .﹖ 綠夢飛影 雪玲珑 善良Vs邪神 ♂葬≡ω≡祤 SOSO用户 灬莣ろ伱﹖ `〇畏.尛媫 ●.┍晨曦┚ o.﹎尜篈 Kld.Andy 绝不/aiq后悔 傷心≌無奈 永遠ご㊣戀ぷ _▂.絕い朢 缺失的天空 ╳灬笨笨滴ぴ 落叶随风 Z.Z=稀 ┢┦apΡy♂ な星ジ空乄下 最最幸运的人 恶魔/dx 破煖壷 いせ零 ╰⒎厷宔﹖ヤ o.繡譅′」藸 ★.寵愛n1. 愛妳/aiq無悔 川子 じ沉没过后こ ドるビ ↘夨憶m儍お 海洋~ 伤…… 缘来是你 ベwǒ吥後悔 ●(╱引﹎X" 看见老鼠洞 燕子 ·o.苛嗳寶貝 百乐 戀メ僤蒓蘭爱 情是那麼笨 あ浅浅の嘚僾 .ī藍铯哒楓 Se7eη柒.誡 等待 ﹎′.錯覺、 魏向军 → 递归 /:+ COOL狗 ~餉祐赱﹏ 尐嘴亂儭亨 ωǒ/xin伤 聆@听☆世@界 ヅ天使ぺ嫙嵂 〢蘅◆嗳╲↘ -[艹莓頭]’ 兆/fw祺 ·ㄚòひ ? ⒓愛⒉⒍妳 庝♀妍ル SOSO用户 天苍い零儿 寻仙问道 :Iov3寶呗 冰厸¢翔宇 ▌再黬壹橫▌ ゛尛藾の潴ゞ Rеvоlνeг мe˙寳児 X'卜覀亼 ″_.牯惑钕. 冰宫魔女 “喆”以死 优の优love♀ ご孤單菋噵ご  啵罩‵ linda ╰☆冰@だ/cy 笑看人生 SOSO用户 七夜 蓝色古月 末路狂花 21dē愛↗♀ 海方舟/aiq 囧灬墜落天使 |宝贝薇儿 专打龟系列 菏MIN -↘"肚兜 | ′..晕s_ 11 ▄_鬭* _ωǒ﹎鍆~ ˇ葬№嗳√ ╪尐嘴亂親. 亂了放棄感覺 - [藍]1/蒅 Xiǎo/mg輝 ゥ&竹 ゞ戀伱①輩孓 ♂笑骂自由人 `.`.暫無.... shuffle 程思成就未来 阳光的味道 後續★鉉ù 賣血丄網 .◆|.壞秂丿 无缘/tx爱你 xinxing鮭鮭 №恋※舞人间 Mua.〢兲缔℡ 一生兄弟 ⒈笙の僾伱 ssss 冰焰温情 .羙侽籽./db 涟漪 Fly_100% №龍§尐☆ 晨风晓月 gfhjj 芸海桂/tp ★零八★ 深海之潮 飘 ☆☆☆☆☆ 石头 安静的C调 三百六十柒天 寶貝≒淚 糸色 望 ぃ吖ゞ頭 ●'|Xx蔸糨. 双子座飞鸟 SOSO用户 .|°妷.杺! 冷如风 木柔/love 木時 穿睡衣的果冻 语过添情 SOSO用户 ⊙_⊙乖の乖~ -[G/t 镜源世尘 华尔街 echo Dg 傑ル 123  

以下是引用片段:
  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

原创粉丝点击