当前位置: 代码迷 >> ASP >> asp.net文件上载的几种方式
  详细解决方案

asp.net文件上载的几种方式

热度:306   发布时间:2012-07-29 15:26:14.0
asp.net文件下载的几种方式

摘自:http://zhidao.baidu.com/question/171876794.html

阅:经验证,//使用WriteFile下载文件 这个方法,是可以用的;

asp.net2.0以后,我们有了很多种文件下载的选择。

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
  相关解决方案