//输出硬盘文件,提供下载支持大文件、续传、速度限制、资源占用小 //输入参数_Request:Page.Request对象,_Response:Page.Response对象,_fileName:下载文件名,_fullPath:带文件名下载路径,_speed每秒允许下载的字节数 //返回是否成功 publicstaticboolResponseFile(HttpRequest_Request,HttpResponse_Response,string_fileName,string_fullPath,long_speed) { try { FileStreammyFile=newFileStream(_fullPath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite); BinaryReaderbr=newBinaryReader(myFile); try { _Response.AddHeader("Accept-Ranges","bytes"); _Response.Buffer=false; longfileLength=myFile.Length; longstartBytes=0;
intpack=10240;//10Kbytes //intsleep=200;//每秒5次即5*10Kbytes每秒 intsleep=(int)Math.Floor(1000*pack/_speed)+1; if(_Request.Headers["Range"]!=null) { _Response.StatusCode=206; string[]range=_Request.Headers["Range"].Split(newchar[]{'=','-'}); 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); intmaxCount=(int)Math.Floor((fileLength-startBytes)/pack)+1;
for(inti=0;i<maxCount;i++) { if(_Response.IsClientConnected) { _Response.BinaryWrite(br.ReadBytes(pack)); Thread.Sleep(sleep); } else { i=maxCount; } } } catch { returnfalse; } finally { br.Close(); myFile.Close(); } } catch { returnfalse; } returntrue; }
|