zoukankan      html  css  js  c++  java
  • c# 浏览器弹出提示框下载文件

    c#下载文件四种方法:

    1. 流方式下载:

            /// <summary>
            /// 流方式下载文件不能超过400M
            /// </summary>
            /// <param name="filePath"></param>
            public void RenderToBrowser(string filePath)
            {
                filePath = Server.MapPath(filePath);//路径 
                //以字符流的形式下载文件 
                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";
                //文件名+文件格式 (这里编码采用的是utf-8)
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode("文件名.txt", System.Text.Encoding.UTF8));
                Response.BinaryWrite(bytes);
                Response.Flush();
                Response.End();
            }

     2.TransmitFile实现下载:

            /// <summary>
            /// TransmitFile下载文件
            /// </summary>
            /// <param name="filePath">服务器相对路径</param>
            public void TransmitFile(string filePath)
            {
                try
                {
                    filePath = Server.MapPath(filePath);
                    if (File.Exists(filePath))
                    {
                        FileInfo info = new FileInfo(filePath);
                        long fileSize = info.Length;
                        HttpContext.Current.Response.Clear();
    
                        //指定Http Mime格式为压缩包
                        HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
    
                        // Http 协议中有专门的指令来告知浏览器, 本次响应的是一个需要下载的文件. 格式如下:
                        // Content-Disposition: attachment;filename=filename.txt
                        //客户端保存的文件名 info.Name(例如 aaa.txt) 编码格式为utf-8
                        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(info.Name, System.Text.Encoding.UTF8));
    
                        //不指明Content-Length用Flush的话不会显示下载进度   
                        HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
                        HttpContext.Current.Response.TransmitFile(filePath, 0, fileSize);
                        HttpContext.Current.Response.Flush();
                    }
                }
                catch
                { }
                finally
                {
                    HttpContext.Current.Response.Close();
                }
    
            }

     3.WriteFile实现下载:

            /// <summary>
            /// 使用WriteFile下载文件  
            /// </summary>
            /// <param name="filePath">相对路径</param>
            public void WriteFile(string filePath)
            {
                try
                {
                    filePath = Server.MapPath(filePath);
                    if (File.Exists(filePath))
                    {
                        FileInfo info = new FileInfo(filePath);
                        long fileSize = info.Length;
                        HttpContext.Current.Response.Clear();
                        HttpContext.Current.Response.ContentType = "application/octet-stream";
                        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachement;filename=" + HttpUtility.UrlEncode(info.Name, System.Text.Encoding.UTF8));
                        //指定文件大小   
                        HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
                        HttpContext.Current.Response.WriteFile(filePath, 0, fileSize);
                        HttpContext.Current.Response.Flush();
                    }
                }
                catch
                { }
                finally
                {
                    HttpContext.Current.Response.Close();
                }
            }

     4.WriteFile分块下载:

            /// <summary>
            /// 使用OutputStream.Write分块下载文件  
            /// </summary>
            /// <param name="filePath"></param>
            public void WriteFileBlock(string filePath)
            {
                filePath = Server.MapPath(filePath);
                if (!File.Exists(filePath))
                {
                    return;
                }
                FileInfo info = new FileInfo(filePath);
                //指定块大小   
                long chunkSize = 4096;
                //建立一个4K的缓冲区   
                byte[] buffer = new byte[chunkSize];
                //剩余的字节数   
                long dataToRead = 0;
                FileStream stream = null;
                try
                {
                    //打开文件   
                    stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    
                    dataToRead = stream.Length;
    
                    //添加Http头   
                    HttpContext.Current.Response.ContentType = "application/octet-stream";
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachement;filename=" + HttpUtility.UrlEncode(info.Name, System.Text.Encoding.UTF8));
                    HttpContext.Current.Response.AddHeader("Content-Length", dataToRead.ToString());
    
                    while (dataToRead > 0)
                    {
                        if (HttpContext.Current.Response.IsClientConnected)
                        {
                            //public abstract int Read(byte[] buffer, int offset, int count)
                            //buffer缓冲区;offset:缓冲区存储数据的开始位置 count: 从流中最多读取的字节数
                            int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                            HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);
                            HttpContext.Current.Response.Flush();
                            HttpContext.Current.Response.Clear();
                            dataToRead -= length;
                        }
                        else
                        {
                            //防止client失去连接   
                            dataToRead = -1;
                        }
                    }
                }
                catch 
                { }
                finally
                {
                    if (stream != null)
                    {
                        stream.Close();
                    }
                    HttpContext.Current.Response.Close();
                }
    
            }
  • 相关阅读:
    解决了一个java服务线程退出的问题
    怎么实现软件注册码功能?
    数据挖掘学习笔记
    IP网段拆分出多个IP
    Java list分割批量处理
    pyecharts import Bar后找不到Bar,或报错AttributeError: 'str' object has no attribute 'get'
    SqlServer 按日、周、月、季、年统计SQL语句
    Redis知识点
    js对类似Excel表头数据排序:A1,A10,A11,B1
    Elasticsearch面试题
  • 原文地址:https://www.cnblogs.com/bweb/p/4711412.html
Copyright © 2011-2022 走看看