下载文件的方法

经常用到导出文件的功能,在导出文件后,首先文件是暂时保存在服务器上的一个临时目录中,然后调用下面的方法将文件输出到客户端供用户下载。下载完成后,并删除服务器上的临时文件。
代码
/// <summary>
/// 从服务器下载文件到客户端
/// </summary>
/// <param name="filepath">要下载文件的绝对物理路径</param>
public static void OutputFileToClient(string filepath)
{
    System.IO.Stream iStream 
= null;
    
// Buffer to read 10K bytes in chunk:
    byte[] buffer = new Byte[10000];
    
// Length of the file:
    int length;
    
// Total bytes to read:
    long dataToRead;
    
//得到文件名
    string filename = System.IO.Path.GetFileName(filepath);
    
//当前 http 上下文
    HttpContext context = HttpContext.Current;
    
try
    {
        
// Open the file.
        iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                     System.IO.FileAccess.Read, System.IO.FileShare.Read);

        
// Total bytes to read:
        dataToRead = iStream.Length;

        context.Response.ContentType 
= "application/octet-stream";
        context.Response.AddHeader(
"Content-Disposition""attachment; filename=" + filename);

        
// Read the bytes.
        while (dataToRead > 0)
        {
            
// Verify that the client is connected.
            if (context.Response.IsClientConnected)
            {
                
// Read the data in buffer.
                length = iStream.Read(buffer, 010000);

                
// Write the data to the current output stream.
                context.Response.OutputStream.Write(buffer, 0, length);

                
// Flush the data to the HTML output.
                context.Response.Flush();

                buffer 
= new Byte[10000];
                dataToRead 
= dataToRead - length;
            }
            
else
            {
                
//prevent infinite loop if user disconnects
                dataToRead = -1;
            }
        }
    }
    
catch (Exception ex)
    {
        
throw ex;
    }
    
finally
    {
        
if (iStream != null)
        {
            
//Close the file.
            iStream.Close();
            
//删除服务器上的文件
            System.IO.File.Delete(filepath);
        }
        
//结束输出流
        context.Response.Close();
    }
}

 

posted @ 2010-01-25 16:41  code_flyer  阅读(289)  评论(0编辑  收藏  举报