• C# 文件下载


    从网上找来一些关于文件下载的方法,提供参考和思路:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    //TransmitFile实现下载 
        protected void Button1_Click(object sender, EventArgs e) 
        
            /*
             微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
             下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
             代码如下:
             */ 
       
            Response.ContentType = "application/x-zip-compressed"
            string FileName = "test.doc"
            //使用UTF-8对文件名进行编码 
            Response.AppendHeader("Content-Disposition", "attachment;filename="" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + """); 
            Response.ContentType = "application/octet-stream"
            Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName); 
            string filename = Server.MapPath("../ReportTemplate/test.doc"); 
            Response.TransmitFile(filename); 
        
       
        //WriteFile实现下载 
        protected void Button2_Click(object sender, EventArgs e) 
        
             /*
             using System.IO;         
             */ 
            string fileName = "test.doc";//客户端保存的文件名 
            string filePath = Server.MapPath("../ReportTemplate/test.doc");//路径 
            FileInfo fileInfo = new FileInfo(filePath); 
            Response.Clear(); 
            Response.ClearContent(); 
            Response.ClearHeaders(); 
            Response.AddHeader("Content-Disposition", "attachment;filename="" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + """); 
            Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
            Response.AddHeader("Content-Transfer-Encoding", "binary"); 
            Response.ContentType = "application/octet-stream"
            Response.WriteFile(fileInfo.FullName); 
            Response.Flush(); 
            Response.End(); 
        
       
        //WriteFile分块下载 
        protected void Button3_Click(object sender, EventArgs e) 
        
            string fileName = "test.doc";//客户端保存的文件名 
            string filePath = Server.MapPath("../ReportTemplate/test.doc");//路径 
       
       
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); 
       
       
            if (fileInfo.Exists == true
            
                const long ChunkSize = 102400; //100K 每次读取文件,只读取100K,这样可以缓解服务器的压力 
                byte[] buffer = new byte[ChunkSize]; 
       
       
                Response.Clear(); 
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath); 
                long dataLengthToRead = iStream.Length; //获取下载的文件总大小 
                Response.ContentType = "application/octet-stream"
                Response.AddHeader("Content-Disposition"
                    "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); 
                while (dataLengthToRead > 0 && Response.IsClientConnected) 
                
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize)); //读取的大小 
                    Response.OutputStream.Write(buffer, 0, lengthRead); 
                    Response.Flush(); 
                    dataLengthToRead = dataLengthToRead - lengthRead; 
                
                Response.Close(); 
            
        
       
        //流方式下载 
        protected void Button4_Click(object sender, EventArgs e) 
        
            string fileName = "test.doc";//客户端保存的文件名 
            string filePath = Server.MapPath("../ReportTemplate/test.doc");//路径 
       
            //以字符流的形式下载文件 
            FileStream fs = new FileStream(filePath, FileMode.Open); 
            byte[] bytes = new byte[(int)fs.Length]; 
            fs.Read(bytes, 0, bytes.Length); 
            fs.Close(); 
            Response.ContentType = "application/octet-stream"
            //通知浏览器下载文件而不是打开 
            Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); 
            Response.BinaryWrite(bytes); 
            Response.Flush(); 
            Response.End(); 
        
    }

    注意:如果直接在aspx.cs上写以上的代码,response一定要手动关闭,否则就会把整个页面的HTML代码都给下载了。

    还有一种方式就是把上面的代码放入一个一般处理程序中这样就可以很好的避免下载整个页面的HTML代码

    代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    using System.Web;
    using ECS.Biz.Common.Common;
    using ECS.Biz.DEPG1210Ds.ServiceModel;
     
    namespace ECS.Web.Handle
    {
        /// <summary>
        /// DownLoad の概要の説明
        /// </summary>
        public class DownLoadHttpHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
        {
     
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";          //因为用到了session传值,所以DownLoadHttpHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
                DEPG1210DsSvm l_svmDEPG1210Ds = (DEPG1210DsSvm)context.Session[ConstData.Session.DEPG1210_DEPG1210DsSvm];
                string l_strFileName = l_svmDEPG1210Ds.DEPG1210DsCtx.ConferenceInfoTbl.Entities[0].JournalsFileName;
                byte[] l_bytFileData = l_svmDEPG1210Ds.DEPG1210DsCtx.ConferenceInfoTbl.Entities[0].JournalsContent;
                //HttpContext.Current.Response.Clear();
                l_strFileName = System.Web.HttpUtility.UrlEncode(l_strFileName);
                HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + l_strFileName);
                if (l_bytFileData.Length == 0)
                {
                    l_bytFileData = System.Text.Encoding.Unicode.GetBytes(" ");
                }
                HttpContext.Current.Response.BinaryWrite(l_bytFileData);
                //HttpContext.Current.Response.Flush();
                //HttpContext.Current.Response.End();
            }
     
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }

    这个的传值我用的是Session来传值的所以画面调用的话就会很简单了

    1
    2
    <asp:LinkButton ID="lbtnAttachFiles" runat="server" href="../Handle/DownLoadHttpHandler.ashx"
                                                            Width="160px" CssClass="ShortNameShow"></asp:LinkButton>

      

    出处:http://www.cnblogs.com/WarBlog/p/5821948.html

  • 相关阅读:
    正则表达式在线测试(生成)工具
    org.eclipse.swt.custom.StyledText.getScrollbarsMode()I
    MySQL修改表一次添加多个列(字段)和索引
    How can I view currently running MySQL queries?( 查看正在运行的MySQL语句/脚本命令)
    faster alter table add column
    提取data.frame中的部分数据(不含列标题和行标题)
    How to generate a random number in R
    INSTALLMENT of QValue
    Linux 执行ll命令时指定按文件时间或大小排序
    替换 data.frame 中的特殊的值
  • 原文地址:https://www.cnblogs.com/mq0036/p/9400223.html
Copyright © 2020-2023  润新知