Click Here

相信能,才能
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

文件下载

Posted on 2006-09-08 16:50  鬼手  阅读(221)  评论(0)    收藏  举报
1.添加自定义类:
using System;
using System.Web;
using System.IO;
using System.Threading;

namespace MyWeb
{
 
/// <summary>
 
/// DownLoad 的摘要说明。
 
/// 输出硬盘文件,提供下载
 
/// </summary>

 public class DownLoad
 
{
  
public DownLoad()
  
{
   
//
   
// TODO: 在此处添加构造函数逻辑
   
//
  }

  
/// <summary>
  
/// 输出硬盘文件,提供下载
  
/// </summary>
  
/// <param name="_Request">Page.Request对象</param>
  
/// <param name="_Response">Page.Response对象</param>
  
/// <param name="_fileName">下载文件名</param>
  
/// <param name="_fullPath">带文件名下载路径</param>
  
/// <param name="_speed"><每秒允许下载的字节数/param>
  
/// <returns>返回是否成功</returns>

  public static bool ResponseFile(HttpRequest _Request,HttpResponse _Response,string _fileName,string _fullPath, long _speed)
  
{
   
try
   
{
    
//建立文件对象
    FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    
//建立流读对象
    BinaryReader br = new BinaryReader(myFile);
    
try
    
{
     _Response.AddHeader(
"Accept-Ranges""bytes");
     _Response.Buffer 
= false;
     
long fileLength = myFile.Length;
     
long startBytes = 0;
     
     
int pack = 10240//10K bytes
     
//int sleep = 200;   //每秒5次   即5*10K bytes每秒
     int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
     
if (_Request.Headers["Range"!= null)
     
{
      _Response.StatusCode 
= 206;
      
string[] range = _Request.Headers["Range"].Split(new char[] {'=''-'});
      startBytes 
= Convert.ToInt64(range[1]);
     }

     _Response.AddHeader(
"Content-Length", (fileLength - startBytes).ToString());
     
if (startBytes != 0)
     
{
      _Response.AddHeader(
"Content-Range"string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
     }

     _Response.AddHeader(
"Connection""Keep-Alive");
     _Response.ContentType 
= "application/octet-stream";
     _Response.AddHeader(
"Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
 
     br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
     
int maxCount = (int) Math.Floor((fileLength - startBytes) / pack) + 1
     
for (int i = 0; i < maxCount; i++)
     
{
      
if (_Response.IsClientConnected)
      
{
       _Response.BinaryWrite(br.ReadBytes(pack));
       Thread.Sleep(sleep);
      }

      
else
      
{
       i
=maxCount; 
   
      }

     }

    }

    
catch
    
{
     
return false;
    }

    
finally
    
{
     br.Close();
     myFile.Close();
    }

   }

   
catch
   
{
    
return false;
   }

   
return true;
  }


 }

}

2.网页中调用,如download.aspx。在download.aspx.cs文件的Page_Load中:

Page.Response.Clear();
   
   
string FileName=Server.MapPath("路径")+Server.UrlDecode(Request.QueryString["FileName"].Trim()).Trim();//完整路径 
   string str=Server.UrlDecode(Request.QueryString["FileName"]).Trim();//文件名
   DownLoad mydown=new DownLoad();
   
bool success =MyWeb.DownLoad.ResponseFile(Page.Request, Page.Response, str,FileName, 1024000);
   
   
if(!success)
    Response.Write(
"下载文件出错");

   Page.Response.End();
3.下载列表页面中:
<a href='download.aspx?FileName=文件名'>下载</a>//用Server.UrlEncode编码的文件名
以上代码经过测试,并且支持中文文件名。唯一还没处理的是,如果文件名中含有空格,下载时会变成+号。