Asp.Net 分段,断点,下载

Asp.Net 分段,断点,下载

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
     
public static void DownloadFile(HttpContext context, string filePath)
{
UtilLite.Guard
< ArgumentNullException > (context == null );
FileInfo file
= new FileInfo(filePath);
UtilLite.Guard
< FileNotFoundException > ( ! file.Exists);
context.Response.Clear();
context.Response.Buffer
= false ;
context.Response.AppendHeader(
" Content-Disposition " , " attachment;filename= " + HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(file.Name)));
context.Response.AppendHeader(
" Content-Length " , file.Length.ToString());
context.Response.ContentType
= " application/octet-stream " ;
context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.End();
}

public static void Range(HttpContext context, string filePath)
{
UtilLite.Guard
< ArgumentNullException > (context == null );
HttpRequest Request
= context.Request;
HttpResponse Response
= context.Response;
Response.Clear();
Response.Buffer
= false ;
Response.AddHeader(
" Accept-Ranges " , " bytes " );
int bufferSize = 4096 ;
byte [] buffer = new byte [bufferSize];
using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize))
{
long p = 0L , l = stream.Length;
#region Resolve Range
string range = Request.Headers[ " Range " ];
if (range != null )
{
// Range:bytes=1024-
// Range:bytes=1024-2048
// Range:bytes=-1024
// Range:bytes=0-512,1024-2048
int index = range.IndexOf( " = " );
if (index != - 1 )
{
string [] ranges = range.Substring(index + 1 ).Split( ' , ' );
if (ranges.Length > 1 )
{
// not supported multipart/byterange
}
else
{
bool flag = false ;
if (ranges[ 0 ].StartsWith( " - " ))
{
long _p, _absp;
if ( long .TryParse(ranges[ 0 ], out _p) && (_absp = Math.Abs(_p)) <= l)
{
if (_p < 0 )
{
p
= l - _absp;
l
= _absp;
flag
= true ;
}
}
}
else
{
ranges
= ranges[ 0 ].Split( ' - ' );
if (ranges.Length == 2 )
{
long _p, _l;
if (ranges[ 1 ] == string .Empty)
{
if ( long .TryParse(ranges[ 0 ], out _p) && _p <= l)
{
p
= _p;
flag
= true ;
}
}
else if ( long .TryParse(ranges[ 0 ], out _p) && long .TryParse(ranges[ 1 ], out _l) && _p > 0 && _l > 0 && _p < _l && _l < l)
{
p
= _p;
l
= _l + 1 ;
flag
= true ;
}
}
}
if (flag)
{
Response.StatusCode
= 206 ;
Response.AddHeader(
" Content-Range " , " bytes " + p.ToString() + " - " + l.ToString() + " / " + stream.Length.ToString());
}
else
{
Response.StatusCode
= 416 ; // Requested range not satisfiable
}
}
}
}
#endregion
Response.AddHeader(
" Content-Disposition " , " attachment;filename= " + HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(Path.GetFileName(filePath))));
Response.AddHeader(
" Content-Length " , l.ToString());
Response.ContentType
= " application/octet-stream " ;
stream.Position
= p;
int read;
while (Response.IsClientConnected && p < l)
{
Response.OutputStream.Write(buffer,
0 , read = stream.Read(buffer, 0 , bufferSize));
Response.Flush();
p
+= read;
}
}
Response.End();
}

 

posted on 2010-08-19 18:23 RockyLOMO 阅读(...) 评论(...) 编辑 收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值