您的位置:首页 > 编程语言 > ASP

ASP.NET提供文件下载函数(支持大文件、续传、速度限制、资源占用小)

2006-11-06 16:50 489 查看
// 输出硬盘文件,提供下载
// 输入参数 _Request: Page.Request对象, _Response: Page.Response对象, _fileName: 下载文件名, _fullPath: 带文件名下载路径, _speed 每秒允许下载的字节数
// 返回是否成功
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;
}

调用例

Page.Response.Clear();

bool success = ResponseFile(Page.Request, Page.Response, "filename", @"C:\download.date", 1024000);

if(!success)
Response.Write("下载文件出错!");
Page.Response.End();

作者Blog:http://blog.csdn.net/nickycheng/

下面是vb.net 版本

Public Function ResponseFile(ByVal FRequest As HttpRequest, ByVal FResponse As HttpResponse, ByVal fileName As String, ByVal fullPath As String, ByVal speed As Long) As Boolean
Try
Dim myFile As FileStream = New FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
Dim br As BinaryReader = New BinaryReader(myFile)
Try
FResponse.AddHeader("Accept-Ranges", "bytes")

FResponse.Buffer = False '關閉存後送出
Dim fileLength As Long = myFile.Length
Dim startBytes As Long = 0

Dim pack As Integer = 10240 '10K bytes
'int sleep = 200; //每秒5次 即5*10K bytes每秒
Dim sleep As Integer = CType(Math.Floor(1000 * pack / speed) + 1, Integer)
If (FRequest.Headers("Range") <> Nothing) Then
FResponse.StatusCode = 206
Dim range() As String = FRequest.Headers("Range").Split(New Char() {"="c, "-"c})
startBytes = Convert.ToInt64(range(1))

End If
FResponse.AddHeader("Content-Length", (fileLength - startBytes).ToString())
If (startBytes <> 0) Then
FResponse.AddHeader("Content-Range", String.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength))
End If
FResponse.AddHeader("Connection", "Keep-Alive")
FResponse.ContentType = "application/octet-stream"
FResponse.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8))

br.BaseStream.Seek(startBytes, SeekOrigin.Begin)
Dim maxCount As Integer = CType(Math.Floor((fileLength - startBytes) / pack) + 1, Integer)
Dim i As Integer
For i = 0 To maxCount - 1 Step i + 1
If (FResponse.IsClientConnected) Then
FResponse.BinaryWrite(br.ReadBytes(pack))
Thread.Sleep(sleep)
Else
i = maxCount
End If
Next
Catch
Return False
Finally
br.Close()
myFile.Close()
End Try
Catch
Return False
End Try
Return True
End Function

調用時:
Page.Response.Clear()
Me.ResponseFile(Page.Request, Page.Response, filename, Server.MapPath(fileurl), 10240)
Page.Response.End()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐