.net 实现文件下载

asp.net2.0以后,我们有了很多种文件下载的选择。view plaincopy to clipboardprint?
public partial class FileDownLoad : System.Web.UI.Page  
    {  
        //提供下载的文件,不编码的话文件名会乱码  
        private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar");  
        private string filePath = HttpContext.Current.Server.MapPath("规范.rar");  
        //使用TransmifFile下载文件  
        protected void btnDL1_Click(object sender, EventArgs e)  
        {  
            FileInfo info = new FileInfo(filePath);  
            long fileSize = info.Length;  
            Response.Clear();  
            Response.ContentType = "application/x-zip-compressed";  
            Response.AddHeader("Content-Disposition", "attachment;filename="+ fileName);  
            //不指明Content-Length用Flush的话不会显示下载进度  
            Response.AddHeader("Content-Length", fileSize.ToString());  
            Response.TransmitFile(filePath, 0, fileSize);  
            Response.Flush();  
            Response.Close();  
        }  
 
        //使用WriteFile下载文件  
        protected void btnDL2_Click(object sender, EventArgs e)  
        {  
            FileInfo info = new FileInfo(filePath);  
            long fileSize = info.Length;  
            Response.Clear();  
            Response.ContentType = "application/octet-stream";  
            Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);  
            //指定文件大小  
            Response.AddHeader("Content-Length", fileSize.ToString());  
            Response.WriteFile(filePath, 0, fileSize);  
            Response.Flush();  
            Response.Close();  
        }  
 
        //使用OutputStream.Write分块下载文件  
        protected void btnDL3_Click(object sender, EventArgs e)  
        {  
            //指定块大小  
            long chunkSize = 102400;  
            //建立一个100K的缓冲区  
            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头  
                Response.ContentType = "application/octet-stream";  
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);  
                Response.AddHeader("Content-Length", dataToRead.ToString());  
 
                while (dataToRead > 0)   
                {  
                    if (Response.IsClientConnected)  
                    {  
                        int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));  
                        Response.OutputStream.Write(buffer, 0, length);  
                        Response.Flush();  
                        Response.Clear();  
                        dataToRead -= length;  
                    }  
                    else   
                    {  
                        //防止client失去连接  
                        dataToRead = -1;  
                    }  
                }  
            }  
            catch (Exception ex)  
            {  
                Response.Write("Error:" + ex.Message);  
            }  
            finally   
            {  
                if (stream != null)   
                {  
                    stream.Close();  
                }  
                Response.Close();  
            }  
        }  
 
        //使用BinaryWrite下载文件,大文件效率不行  
        protected void btnDL4_Click(object sender, EventArgs e)  
        {  
            FileStream stream = null;  
            try   
            {  
                //读文件,大文件一次读入会占用大量内存  
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);  
                byte[] bytes = new byte[stream.Length];  
                stream.Read(bytes, 0, bytes.Length);  
                stream.Close();  
 
                //添加Http头  
                Response.ContentType = "application/octet-stream";  
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);  
                Response.AddHeader("Content-Length", bytes.Length.ToString());  
                Response.BinaryWrite(bytes);  
                Response.Flush();  
            }  
            catch (Exception ex)  
            {  
                Response.Write("Error:" + ex.Message);  
            }  
            finally   
            {  
                if (stream != null)   
                {  
                    stream.Close();  
                }  
                Response.Close();  
            }  
        }  
        //使用BinaryWrite分块下载文件  
        protected void btnDL5_Click(object sender, EventArgs e)  
        {  
            //指定区块和缓冲区  
            long chunkSize = 102400;  
            byte[] buffer = new byte[chunkSize];  
            FileStream stream = null;  
            long dataToRead = 0;  
            try   
            {  
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);  
                dataToRead = stream.Length;  
                //添加Http头  
                Response.ContentType = "application/octet-stream";  
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);  
                Response.AddHeader("Content-Length", dataToRead.ToString());  
 
                while (dataToRead > 0)   
                {  
                    if (Response.IsClientConnected)  
                    {  
                        int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));  
                        Response.BinaryWrite(buffer);  
                        Response.Flush();  
                        Response.Clear();  
 
                        dataToRead -= length;  
                    }  
                    else   
                    {  
                        dataToRead = -1;  
                    }  
                }  
 
            }  
            catch(Exception ex)  
            {  
                Response.Write("Error:" + ex.Message);  
            }  
            finally 
            {  
                if (stream != null)   
                {  
                    stream.Close();  
                }  
                Response.Close();  
            }  
        }  
    } 
public partial class FileDownLoad : System.Web.UI.Page
    {
        //提供下载的文件,不编码的话文件名会乱码
        private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar");
        private string filePath = HttpContext.Current.Server.MapPath("规范.rar");
        //使用TransmifFile下载文件
        protected void btnDL1_Click(object sender, EventArgs e)
        {
            FileInfo info = new FileInfo(filePath);
            long fileSize = info.Length;
            Response.Clear();
            Response.ContentType = "application/x-zip-compressed";
            Response.AddHeader("Content-Disposition", "attachment;filename="+ fileName);
            //不指明Content-Length用Flush的话不会显示下载进度
            Response.AddHeader("Content-Length", fileSize.ToString());
            Response.TransmitFile(filePath, 0, fileSize);
            Response.Flush();
            Response.Close();
        }

        //使用WriteFile下载文件
        protected void btnDL2_Click(object sender, EventArgs e)
        {
            FileInfo info = new FileInfo(filePath);
            long fileSize = info.Length;
            Response.Clear();
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
            //指定文件大小
            Response.AddHeader("Content-Length", fileSize.ToString());
            Response.WriteFile(filePath, 0, fileSize);
            Response.Flush();
            Response.Close();
        }

        //使用OutputStream.Write分块下载文件
        protected void btnDL3_Click(object sender, EventArgs e)
        {
            //指定块大小
            long chunkSize = 102400;
            //建立一个100K的缓冲区
            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头
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
                Response.AddHeader("Content-Length", dataToRead.ToString());

                while (dataToRead > 0)
                {
                    if (Response.IsClientConnected)
                    {
                        int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                        Response.OutputStream.Write(buffer, 0, length);
                        Response.Flush();
                        Response.Clear();
                        dataToRead -= length;
                    }
                    else
                    {
                        //防止client失去连接
                        dataToRead = -1;
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write("Error:" + ex.Message);
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                Response.Close();
            }
        }

        //使用BinaryWrite下载文件,大文件效率不行
        protected void btnDL4_Click(object sender, EventArgs e)
        {
            FileStream stream = null;
            try
            {
                //读文件,大文件一次读入会占用大量内存
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, bytes.Length);
                stream.Close();

                //添加Http头
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
                Response.AddHeader("Content-Length", bytes.Length.ToString());
                Response.BinaryWrite(bytes);
                Response.Flush();
            }
            catch (Exception ex)
            {
                Response.Write("Error:" + ex.Message);
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                Response.Close();
            }
        }
        //使用BinaryWrite分块下载文件
        protected void btnDL5_Click(object sender, EventArgs e)
        {
            //指定区块和缓冲区
            long chunkSize = 102400;
            byte[] buffer = new byte[chunkSize];
            FileStream stream = null;
            long dataToRead = 0;
            try
            {
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                dataToRead = stream.Length;
                //添加Http头
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
                Response.AddHeader("Content-Length", dataToRead.ToString());

                while (dataToRead > 0)
                {
                    if (Response.IsClientConnected)
                    {
                        int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                        Response.BinaryWrite(buffer);
                        Response.Flush();
                        Response.Clear();

                        dataToRead -= length;
                    }
                    else
                    {
                        dataToRead = -1;
                    }
                }

            }
            catch(Exception ex)
            {
                Response.Write("Error:" + ex.Message);
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                Response.Close();
            }
        }
    }

以上除了第四种不推荐以外,其他的都可以,但是个人感觉分块下载的要好一点。没有仔细测试,所以可能有问题。

注意:对于中文文件名要编码才能正确显示。对于长中文文件名(UTF8编码后大于153字节的中文)即使编码了,还是有问题的,大家可以参考这个链接。 http://hi.baidu.com/river_5566/blog/item/d66804cef8afb031b700c863.html

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zabcd117/archive/2009/04/24/4107033.aspx

原文地址:https://www.cnblogs.com/weichuo/p/1702867.html