Asp.net 断点续传 下载大文件

        /// <summary>
        
/// 支持断点续传的下载大文件的函数
        
/// </summary>
        
/// <param name="downloadFilePath">被下载文件的路径,相对和绝对都可以</param>
        
/// <param name="showFileName">显示给用户的文件名,可以为空</param>
        
/// <param name="fileType">要下载的文件类型,如果不确定,请留空</param>
        
/// <remarks>用于大文件的下载</remarks>

        public static void BigFileDownload(string downloadFilePath, string showFileName, string fileType)
        
{
            downloadFilePath 
= downloadFilePath.Trim();
            
if(string.Empty == downloadFilePath)
                ShowErrorMessage(
"没有指定要下载的文件路径!");
            
            
if(downloadFilePath.IndexOf(":"< 0)
                downloadFilePath 
= System.Web.HttpContext.Current.Server.MapPath(downloadFilePath);

            showFileName 
= showFileName.Trim();
            
if(string.Empty == showFileName)
                showFileName 
= Path.GetFileName(downloadFilePath);

            showFileName 
= System.Web.HttpUtility.UrlEncode(System.Web.HttpContext.Current.Request.ContentEncoding.GetBytes(showFileName));
            
            fileType 
= fileType.Trim();
            
if(string.Empty == fileType)
                fileType 
= "application/octet-stream";

            System.Web.HttpContext.Current.Response.Clear();
            Stream objStream 
= null;
            
byte[] btBuffer = new byte[8192];  // 1024*8 = 8Kb
            int intLength = 0;
            
long lngData2Read = 0;
            
try
            
{
                
using(objStream = new FileStream(downloadFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                
{
                    lngData2Read 
= objStream.Length;
                    
                    
输出HTTP头信息
                    
                    
while(lngData2Read > 0)
                    
{
                        
if(HttpContext.Current.Response.IsClientConnected)
                        
{
                            intLength 
= objStream.Read(btBuffer, 08192);
                            HttpContext.Current.Response.OutputStream.Write(btBuffer, 
0, intLength);
                            HttpContext.Current.Response.Flush();
                            lngData2Read 
-= intLength;
                            btBuffer 
= new byte[8192];
                        }

                        
else
                        
{
                            lngData2Read 
= -1;
                        }

                    }

                }

            }

            
catch(Exception ex)
            
{
                ShowErrorMessage(ex.Message);
            }

            
// 结束文件下载,此句不可缺少,否则会把本页的HTML代码一起下载文件里
            HttpContext.Current.Response.End();
        }


        
/// <summary>
        
/// 输出错误信息给用户,采用客户端弹出框的方式
        
/// </summary>
        
/// <param name="errorMessage">错误信息的内容</param>

        internal static void ShowErrorMessage(string errorMessage)
        
{
            errorMessage 
= errorMessage.Replace("'""\"");
            System.Web.HttpContext.Current.Response.Write("<script language='javascript'>");
            System.Web.HttpContext.Current.Response.Write(
"alert('");
            System.Web.HttpContext.Current.Response.Write(errorMessage);
            System.Web.HttpContext.Current.Response.Write(
"');</script>");
            System.Web.HttpContext.Current.Response.End();
        }
posted @ 2005-03-29 17:11  三角猫  阅读(1576)  评论(1编辑  收藏  举报