下载文件源码

本文深入探讨了ASP.NET环境下文件下载面临的问题,并详细介绍了使用Response.TransmitFile、WriteFile、分块下载和流方式下载等方法进行高效文件下载的技术实操。针对无法下载动态生成、数据库存储或非Web文件夹中的文件等问题提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们要让用户下载一个文件,最简单的方式是通过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...)


//TransmitFile实现下载

protected void Button1_Click(object sender, EventArgs e)

{

/*

微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite

下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
 

  1.   代码如下:   
  2.  
  3.  */   
  4.  
  5.  Response.ContentType = "application/x-zip-compressed";  
  6.  
  7.  Response.AddHeader("Content-Disposition""attachment;filename=z.zip");  
  8.  
  9.  string filename = Server.MapPath("DownLoad/z.zip");  
  10.  
  11.  Response.TransmitFile(filename);  
  12.  
  13. }  
  14.  
  15. //WriteFile实现下载   
  16.  
  17. protected void Button2_Click(object sender, EventArgs e)  
  18.  
  19. {  
  20.    /*   
  21.  
  22.      using System.IO;  
  23.  
  24.    */ 
  25.  
  26.   string fileName = "asd.txt";//客户端保存的文件名   
  27.  
  28.   string filePath = Server.MapPath("DownLoad/aaa.txt");//路径  
  29.  
  30.   FileInfo fileInfo = new FileInfo(filePath);  
  31.  
  32.   Response.Clear();  
  33.  
  34.   Response.ClearContent();  
  35.  
  36.   Response.ClearHeaders();  
  37.  
  38.   Response.AddHeader("Content-Disposition""attachment;filename=" + fileName);  
  39.  
  40.   Response.AddHeader("Content-Length", fileInfo.Length.ToString());  
  41.  
  42.   Response.AddHeader("Content-Transfer-Encoding""binary");  
  43.  
  44.   Response.ContentType = "application/octet-stream";  
  45.  
  46.   Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");  
  47.  
  48.   Response.WriteFile(fileInfo.FullName);  
  49.  
  50.   Response.Flush();  
  51.  
  52.   Response.End();  
  53.  
  54. }  
  55. //WriteFile分块下载   
  56.  
  57. protected void Button3_Click(object sender, EventArgs e)  
  58. {   
  59.    string fileName = "aaa.txt";//客户端保存的文件名   
  60.  
  61.    string filePath = Server.MapPath("DownLoad/aaa.txt");//路径  
  62.  
  63.    System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);  
  64.  
  65.  if (fileInfo.Exists == true)  
  66.  
  67.  {  
  68.    const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力   
  69.  
  70.    byte[] buffer = new byte[ChunkSize];  
  71.  
  72.    Response.Clear();  
  73.  
  74.    System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);  
  75.  
  76.    long dataLengthToRead = iStream.Length;//获取下载的文件总大小   
  77.  
  78.    Response.ContentType = "application/octet-stream";  
  79.  
  80.    Response.AddHeader("Content-Disposition""attachment; filename=" + HttpUtility.UrlEncode(fileName));  
  81.  
  82.    while (dataLengthToRead > 0 && Response.IsClientConnected)  
  83.  
  84.    {  
  85.  
  86.        int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小   
  87.  
  88.        Response.OutputStream.Write(buffer, 0, lengthRead);  
  89.  
  90.        Response.Flush();  
  91.  
  92.        dataLengthToRead = dataLengthToRead - lengthRead;  
  93.  
  94.    }  
  95.  
  96.    Response.Close();  
  97.  
  98.  }  
  99.  
  100. }  
  101.  
  102. //流方式下载   
  103.  
  104. protected void Button4_Click(object sender, EventArgs e)  
  105. {  
  106.  
  107.    string fileName = "aaa.txt";//客户端保存的文件名   
  108.  
  109.    string filePath = Server.MapPath("DownLoad/aaa.txt");//路径  
  110.  
  111.    //以字符流的形式下载文件   
  112.  
  113.    FileStream fs = new FileStream(filePath, FileMode.Open);  
  114.  
  115.    byte[] bytes = new byte[(int)fs.Length];  
  116.  
  117.    fs.Read(bytes, 0, bytes.Length);  
  118.  
  119.    fs.Close();  
  120.  
  121.    Response.ContentType = "application/octet-stream";  
  122.  
  123.    //通知浏览器下载文件而不是打开   
  124.  
  125.    Response.AddHeader("Content-Disposition""attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));  
  126.  
  127.    Response.BinaryWrite(bytes);  
  128.  
  129.    Response.Flush();  
  130.  
  131.    Response.End();  
  132.  
  133. }  
  134.  
  135. //----------------------------------------------------------  
  136.  
  137.  
  138. public void DownloadFile( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FileBody )  
  139.  
  140. {  
  141.  
  142.   WebForm.Response.ClearHeaders();  
  143.  
  144.   WebForm.Response.Clear();  
  145.  
  146.   WebForm.Response.Expires = 0;  
  147.  
  148.   WebForm.Response.Buffer = true;  
  149.  
  150.   WebForm.Response.AddHeader("Accept-Language""zh-tw");  
  151.  
  152.   //'文件名称  
  153.   string filename=HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8);
  154.   WebForm.Response.AddHeader("content-disposition""attachment; filename='"+filename+"'");  
  155.  
  156.   WebForm.Response.ContentType = "Application/octet-stream";  
  157.  
  158.   //'文件内容  
  159.  
  160.   WebForm.Response.Write(FileBody);//-----------  
  161.  
  162.     WebForm.Response.End();  
  163.  
  164. }  
  165.  
  166. //上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数:  
  167.  
  168. public void DownloadFileByFilePath( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FilePath )  
  169.  
  170. {  
  171.  
  172.   WebForm.Response.ClearHeaders();  
  173.  
  174.   WebForm.Response.Clear();  
  175.  
  176.   WebForm.Response.Expires = 0;  
  177.  
  178.     WebForm.Response.Buffer = true;  
  179.  
  180.   WebForm.Response.AddHeader("Accept-Language""zh-tw");  
  181.  
  182.   //文件名称  
  183.    string filename=HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8);
  184.   WebForm.Response.AddHeader("content-disposition""attachment; filename='" + filename +"'" );  
  185.  
  186.   WebForm.Response.ContentType = "Application/octet-stream";  
  187.  
  188.   //文件内容  
  189.  
  190.   WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath));//---------  
  191.  
  192.   WebForm.Response.End();  
  193.  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值