代码改变世界

ASP.NET 实现文件下载的几种方法

2009-03-21 10:21  Fred-Xu  阅读(579)  评论(0编辑  收藏  举报

一、调用 TransmitFile 方法。

缺点:对于浏览器能解析的文件类型,不会弹出保存框,直接被浏览器显示。例如:TXT,XML等

代码样例:

        
  1. Response.ContentType = "application/x-zip-compressed";   
  2.     
  3. Response.AddHeader("Content-Disposition""attachment;filename=test.zip");   
  4.     
  5. string filename = Server.MapPath("DownLoad/test.zip");   
  6.     
  7. Response.TransmitFile(filename);  

二、调用 WritFile 方法

缺点同上。

代码样例:

        
  1. string fileName ="aaa.zip";//客户端保存的文件名   
  2.     
  3. string filePath=Server.MapPath("DownLoad/aaa.zip");//路径   
  4.     
  5. FileInfo fileInfo = new FileInfo(filePath);   
  6.     
  7. Response.Clear();   
  8.     
  9. Response.ClearContent();   
  10.     
  11. Response.ClearHeaders();   
  12.     
  13. Response.AddHeader("Content-Disposition""attachment;filename=" + fileName);   
  14.     
  15. Response.AddHeader("Content-Length", fileInfo.Length.ToString());   
  16.     
  17. Response.AddHeader("Content-Transfer-Encoding""binary");   
  18.     
  19. Response.ContentType = "application/octet-stream";   
  20.     
  21. Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");   
  22.     
  23. Response.WriteFile(fileInfo.FullName);   
  24.     
  25. Response.Flush();   
  26.     
  27. Response.End();  

三、分块下载

特点:适合传输大文件。没有浏览器直接显示文件的缺点。

        
  1. string fileName = "aaa.zip";//客户端保存的文件名   
  2.     
  3. string filePath = Server.MapPath("DownLoad/aaa.zip");//路径   
  4.     
  5. System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);   
  6.     
  7. if (fileInfo.Exists == true)   
  8.     
  9. {   
  10.     
  11. const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力   
  12.     
  13. byte[] buffer = new byte[ChunkSize];   
  14.     
  15. Response.Clear();   
  16.     
  17. System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);   
  18.     
  19. long dataLengthToRead = iStream.Length;//获取下载的文件总大小   
  20.     
  21. Response.ContentType = "application/octet-stream";   
  22.     
  23. Response.AddHeader("Content-Disposition""attachment; filename=" + HttpUtility.UrlEncode(fileName));   
  24.     
  25. while (dataLengthToRead > 0 && Response.IsClientConnected)   
  26.     
  27. {   
  28.     
  29. int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小   
  30.     
  31. Response.OutputStream.Write(buffer, 0, lengthRead);   
  32.     
  33. Response.Flush();   
  34.     
  35. dataLengthToRead = dataLengthToRead - lengthRead;   
  36.     
  37. }   
  38.     
  39. Response.Close();   
  40.     
  41. }   

 

四、BinaryWrite 方法

特点:与方法三一样避免了浏览器的直接解析,也是通过二进制流传输,但是不是分块提供下载,而是整个文件一次传输,适合下载小文件。

代码样例:

五、ContentType设置改进

ASP.NET中设置文件下载总结起来就是三个步骤:

1.设置Response的报文头。

最主要的是设置Content-Type,Content-Disposition

2.读出文件,写入Response流

3.发送,也就是先Flush,再End.

在这里有一个根据系统注册表自动设置文件Content-Type的方法:

        
  1. string saveFileName = "test.exe";   
  2.     
  3. int intStart = filename.LastIndexOf("\") + 1;   
  4.     
  5. saveFileName = filename.Substring(intStart, filename.Length - intStart);   
  6.     
  7. System.IO.FileInfo fi = new System.IO.FileInfo(filename);   
  8.     
  9. string fileextname = fi.Extension;   
  10.     
  11. string DEFAULT_CONTENT_TYPE = "application/unknown";   
  12.     
  13. RegistryKey regkey, fileextkey;   
  14.     
  15. string filecontenttype;   
  16.     
  17. try  
  18.     
  19. {   
  20.     
  21. regkey = Registry.ClassesRoot;   
  22.     
  23. fileextkey = regkey.OpenSubKey(fileextname);   
  24.     
  25. filecontenttype = fileextkey.GetValue("Content Type", DEFAULT_CONTENT_TYPE).ToString();   
  26.     
  27. }   
  28.     
  29. catch  
  30.     
  31. {   
  32.     
  33. filecontenttype = DEFAULT_CONTENT_TYPE;   
  34.     
  35. }   
  36.     
  37. Response.Clear();   
  38.     
  39. Response.Charset = "utf-8";   
  40.     
  41. Response.Buffer = true;   
  42.     
  43. this.EnableViewState = false;   
  44.     
  45. Response.ContentEncoding = System.Text.Encoding.UTF8;   
  46.     
  47. Response.AppendHeader("Content-Disposition""attachment;filename=" + saveFileName);   
  48.     
  49. Response.ContentType = filecontenttype;   
  50.     
  51. Response.WriteFile(filename);   
  52.     
  53. Response.Flush();   
  54.     
  55. Response.Close();   
  56.     
  57. Response.End();   
        
  1. string fileName = "aaa.zip";//客户端保存的文件名   
  2.     
  3. string filePath = Server.MapPath("DownLoad/aaa.zip");//路径   
  4.     
  5. //以字符流的形式下载文件   
  6.     
  7. FileStream fs = new FileStream(filePath, FileMode.Open);   
  8.     
  9. byte[] bytes = new byte[(int)fs.Length];   
  10.     
  11. fs.Read(bytes, 0, bytes.Length);   
  12.     
  13. fs.Close();   
  14.     
  15. Response.Clear();   
  16.     
  17. Response.ContentType = "application/octet-stream";   
  18.     
  19. //通知浏览器下载文件而不是打开   
  20.     
  21. Response.AddHeader("Content-Disposition""attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));   
  22.     
  23. Response.BinaryWrite(bytes);   
  24.     
  25. Response.Flush();   
  26.     
  27. Response.End();  

 


Tags - asp.net文件下载方法 , .net文件下载方法