zoukankan      html  css  js  c++  java
  • ASP.NET 实现文件下载的几种方法 Fred

    一、调用 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文件下载方法
  • 相关阅读:
    换零钞
    空心菱形
    生成回文数
    机器人数目
    胡同门牌号
    七星填数
    阶乘位数
    打印数字
    平方末尾
    数位和
  • 原文地址:https://www.cnblogs.com/Fred_Xu/p/1446756.html
Copyright © 2011-2022 走看看