ASP网页设计带进度条的ASP无组件断点续传下载
ASP最大的缺点在于网络的安全性和可靠性,企业将经营数据放在开放的平台上,最大的担忧就是如何保证这些数据不被其他人破坏。无组件|下载<%@LANGUAGE="VBSCRIPT"CODEPAGE="936"%><%OptionExplicit%><%
==================================
带进度条的ASP无组件断点续传下载
==================================
简介:
1)使用xmlhttp体例
2)无组件
3)异步体例猎取,节俭服务器资本
4)服务器到服务器的文件传送。(固然,你本人电脑上的IIS也是http服务器)
5)撑持断点续传
6)分段下载
7)利用缓冲区,提拔下载速率
8)撑持年夜文件下载(速率我就不说了,你能够测,用现实措辞)
9)带进度条:下载百分比、下载量、立即下载速率、均匀下载速率
用法:
设置好上面的三个变量,RemoteFileUrl、LocalFileUrl、RefererUrl
半夜狂龙(Madpolice)
madpolice_dong@163.com
2005.12.25
===============================%>
<%------------为设置部分------
<%Server.Scripttimeout=24*60*60剧本超时设置,这里设为24小时%>
<%
DimRemoteFileUrl远程文件路径
DimLocalFileUrl当地文件路径,绝对路径,能够包括/及..
RemoteFileUrl="http://202.102.14.137/win98.zip"
LocalFileUrl="win98.zip"
DimRefererUrl
该属性设置文件下载的援用页,
某些网站只同意经由过程他们网站内的毗连下载文件,
这些网站的服务器判别用户是不是是在他们网站内点击的文件链接就是靠这个属性。
RefererUrl="http://www.skycn.com/crack_skycn.html"若远程服务器未限定,可留空
DimBlockSize分段下载的块巨细
DimBlockTimeout下载块的超不时间(秒)
BlockSize=128*1024128K,按1M带宽盘算的每秒下载量
(可依据本人的带宽设置,带宽除以8),倡议不要设的太小
BlockTimeout=64应该依据块的巨细来设置。这里设为64秒。
假如128K的数据64秒还下载不完(按每秒2K守旧预算),则超时。
DimPercentTableWidth进度条总宽度
PercentTableWidth=560
%>
<%--------------------以上为设置部分---------------%>
<%
***********************************
!!!以下内容不必修正!!!
***********************************
%>
<%
DimLocalFileFullPhysicalPath当地文件在硬盘上的相对路径
LocalFileFullPhysicalPath=Server.Mappath(LocalFileUrl)
%>
<%
Dimhttp,ados
OnErrorResumeNext
Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.7.0")
IfErrThen
Err.Clear
Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.6.0")
IfErrThen
Err.Clear
Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.5.0")
IfErrThen
Err.Clear
Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
IfErrThen
Err.Clear
Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP")
IfErrThen
Err.Clear
Response.Write"服务器不撑持Msxml,本程序没法运转!"
Response.End
EndIf
EndIf
EndIf
EndIf
EndIf
OnErrorGoto0
Setados=Server.CreateObject("Adodb.Stream")
%>
<%
DimRangeStart分段下载的入手下手地位
Dimfso
Setfso=Server.CreateObject("Scripting.FileSystemObject")
Iffso.FileExists(LocalFileFullPhysicalPath)
Then判别要下载的文件是不是已存在
RangeStart=fso.GetFile(LocalFileFullPhysicalPath).Size若存在,以以后文件巨细作为入手下手地位
Else
RangeStart=0若不存在,统统从零入手下手
fso.CreateTextFile(LocalFileFullPhysicalPath).Close新建文件
EndIf
Setfso=Nothing
%>
<%
DimFileDownStart本次下载的入手下手地位
DimFileDownEnd本次下载的停止地位
DimFileDownBytes本次下载的字节数
DimDownStartTime入手下手下载工夫
DimDownEndTime完成下载工夫
DimDownAvgSpeed均匀下载速率
DimBlockStartTime块入手下手下载工夫
DimBlockEndTime块完成下载工夫
DimBlockAvgSpeed块均匀下载速率
DimpercentWidth进度条的宽度
DimDownPercent已下载的百分比
FileDownStart=RangeStart
%>
<%
DimadosCache数据缓冲区
DimadosCacheSize缓冲区巨细
SetadosCache=Server.CreateObject("Adodb.Stream")
adosCache.Type=1数据流范例设为字节
adosCache.Mode=3数据流会见形式设为读写
adosCache.Open
adosCacheSize=4*1024*1024设为4M,
猎取的数据先放到(内存)缓冲区中,当缓冲区满的时分数据写进磁盘
若在本人的电脑上运转本程序,当下载百兆以下级其余年夜文件的时分,可设置年夜的缓冲区
固然,也不要设的太年夜,以免产生(按下扫瞄器上的中断按钮或断电等)
不测情形招致缓冲区中的数据没有存盘,那缓冲区中的数据就白下载了
%>
<%
先显现html头部
Response.Clear
CallHtmlHead()
Response.Flush
%>
<%
DimResponseRange服务器前往的http头中的"Content-Range"
DimCurrentLastBytes以后下载的停止地位(即ResponseRange中的下限)
DimTotalBytes文件总字节数
Dimtemp
分段下载
DownStartTime=Now()
Do
BlockStartTime=Timer()
http.open"GET",RemoteFileUrl,true,"",""用异步体例挪用serverxmlhttp
机关http头
http.setRequestHeader"Referer",RefererUrl
http.setRequestHeader"Accept","*/*"
http.setRequestHeader"User-Agent","Baiduspider+(
+http://www.baidu.com/search/spider.htm)"假装成Baidu
http.setRequestHeader"User-Agent","Googlebot/2.1(
+http://www.google.com/bot.html)"假装成Google
http.setRequestHeader"Range","bytes=
"&RangeStart&"-"&Cstr(RangeStart+BlockSize-1)分段关头
http.setRequestHeader"Content-Type","application/octet-stream"
http.setRequestHeader"Pragma","no-cache"
http.setRequestHeader"Cache-Control","no-cache"
http.send发送
轮回守候数据吸收
While(http.readyState4)
判别是不是块超时
temp=Timer()-BlockStartTime
If(temp>BlockTimeout)Then
http.abort
Response.Write"<script>document.getElementById(""status"").innerHTML=""<strong>
毛病:数据下载超时,倡议重试。
</strong>"";</script>"&vbNewLine&"</body></html>"
CallErrHandler()
CallCloseObject()
Response.End
EndIf
http.waitForResponse1000守候1000毫秒
Wend
检测形态
Ifhttp.status=416Then服务器不克不及满意客户在哀求中指定的Range头。应该是已下载终了。
FileDownEnd=FileDownStart设置一下FileDownEnd,以免前面的FileDownBytes盘算堕落
CallCloseObject()
ExitDo
EndIf
检测形态
Ifhttp.status>299Thenhttp堕落
Response.Write"<script>document.getElementById(""status"").innerHTML=""<strong>http
毛病:"&http.status&""&http.statusText&"</strong>"";
</script>"&vbNewLine&"</body></html>"
CallErrHandler()
CallCloseObject()
Response.End
EndIf
检测形态
Ifhttp.status206Then服务器不撑持断点续传
Response.Write"<script>document.getElementById(""status"").innerHTML=""<strong>
毛病:服务器不撑持断点续传!</strong>"";</script>"&vbNewLine&"</body></html>"
CallErrHandler()
CallCloseObject()
Response.End
EndIf
检测缓冲区是不是已满
IfadosCache.Size>=adosCacheSizeThen
翻开磁盘上的文件
ados.Type=1数据流范例设为字节
ados.Mode=3数据流会见形式设为读写
ados.Open
ados.LoadFromFileLocalFileFullPhysicalPath翻开文件
ados.Position=ados.Size设置文件指针初始地位
将缓冲区数据写进磁盘文件
adosCache.Position=0
ados.WriteadosCache.Read
ados.SaveToFileLocalFileFullPhysicalPath,2掩盖保留
ados.Close
缓冲区复位
adosCache.Position=0
adosCache.SetEOS
EndIf
保留块数据到缓冲区中
adosCache.Writehttp.responseBody写进数据
判别是不是全体(块)下载终了
ResponseRange=http.getResponseHeader("Content-Range")取得http头中的"Content-Range"
IfResponseRange=""Then没有它就不晓得下载完了没有
Response.Write"<script>document.getElementById(""status"").innerHTML=""<strong>
毛病:文件长度未知!</strong>"";</script>"&vbNewLine&"</body></html>"
CallCloseObject()
Response.End
EndIf
temp=Mid(ResponseRange,Instr(ResponseRange,"-")+1)Content-Range是相似123-456/789的模样
CurrentLastBytes=Clng(Left(temp,Instr(temp,"/")-1))123是入手下手地位,456是停止地位
TotalBytes=Clng(Mid(temp,Instr(temp,"/")+1))789是文件总字节数
IfTotalBytes-CurrentLastBytes=1Then
FileDownEnd=TotalBytes
将缓冲区数据写进磁盘文件
ados.Type=1数据流范例设为字节
ados.Mode=3数据流会见形式设为读写
ados.Open
ados.LoadFromFileLocalFileFullPhysicalPath翻开文件
ados.Position=ados.Size设置文件指针初始地位
adosCache.Position=0
ados.WriteadosCache.Read
ados.SaveToFileLocalFileFullPhysicalPath,2掩盖保留
ados.Close
Response.Write"<script>document.getElementById
(""downsize"").innerHTML="""&TotalBytes&""";
</script>"&vbNewLine
Response.Flush
CallCloseObject()
ExitDo停止地位比总巨细少1就暗示传输完成了
EndIf
调剂块入手下手地位,筹办下载下一个块
RangeStart=RangeStart+BlockSize
盘算块下载速率、进度条宽度、已下载的百分比
BlockEndTime=Timer()
temp=(BlockEndTime-BlockStartTime)
Iftemp>0Then
BlockAvgSpeed=Int(BlockSize/1024/temp)
Else
BlockAvgSpeed=""
EndIf
percentWidth=Int(PercentTableWidth*RangeStart/TotalBytes)
DownPercent=Int(100*RangeStart/TotalBytes)
更新进度条
Response.Write"<script>document.getElementById
(""downpercent"").innerHTML="""&DownPercent&"%"";
document.getElementById(""downsize"").innerHTML="""&RangeStart&""";
document.getElementById(""totalbytes"").innerHTML="""&TotalBytes&""";
document.getElementById(""blockavgspeed"").innerHTML="""&BlockAvgSpeed&""";
document.getElementById(""percentdone"").style.width="""&percentWidth&""";
</script>"&vbNewLine
Response.Flush
LoopWhileResponse.IsClientConnected
IfNotResponse.IsClientConnectedThen
Response.End
EndIf
DownEndTime=Now()
FileDownBytes=FileDownEnd-FileDownStart
temp=DateDiff("s",DownStartTime,DownEndTime)
If(FileDownBytes0)And(temp0)Then
DownAvgSpeed=Int((FileDownBytes/1024)/temp)
Else
DownAvgSpeed=""
EndIf
全体下载终了后更新进度条
Response.Write"
<script>document.getElementById(""downpercent"").innerHTML=""100%"";
document.getElementById(""percentdone"").style.width="""&PercentTableWidth&""";
document.getElementById(""percent"").style.display=""none"";
document.getElementById(""status"").innerHTML=""<strong>下载终了!
用时:"&S2T(DateDiff("s",DownStartTime,DownEndTime))&",
均匀下载速率:"&DownAvgSpeed&"K/秒</strong>"";</script>"&vbNewLine
%>
</body>
</html>
<%
SubCloseObject()
Setados=Nothing
Sethttp=Nothing
adosCache.Close
SetadosCache=Nothing
EndSub
%>
<%
http非常加入处置代码
SubErrHandler()
Dimfso
Setfso=Server.CreateObject("Scripting.FileSystemObject")
Iffso.FileExists(LocalFileFullPhysicalPath)Then判别要下载的文件是不是已存在
Iffso.GetFile(LocalFileFullPhysicalPath).Size=0Then若文件巨细为0
fso.DeleteFileLocalFileFullPhysicalPath删除文件
EndIf
EndIf
Setfso=Nothing
EndSub
%>
<%SubHtmlHead()%>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
<title>带进度条的ASP无组件断点续传下载----半夜狂龙(Madpolice)--2005.12.25</title>
</head>
<body>
<divid="status">正鄙人载<spanstyle="color:blue">
<%=RemoteFileUrl%></span>,请稍候...</div>
<div></div>
<divid="progress">已完成:<spanid="downpercent"style="color:green">
</span><spanid="downsize"style="color:red"><%=RangeStart%>
</span>/<spanid="totalbytes"style="color:blue">
</span>字节(<spanid="blockavgspeed"></span>K/秒)</div>
<div></div>
<divid="percent"align="center"style="display:">
<tablestyle="border-collapse:collapse;"border="1"bordercolor="#666666"
cellpadding="0"cellspacing="0"
width="<%=PercentTableWidth%>"
align="center"bgcolor="#eeeeee">
<trheight="20">
<td>
<tableborder="0"width=""cellspacing="1"bgcolor="#0033FF"id="percentdone">
<tr>
<td><td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<%EndSub%>
<%
------------------------------
将秒数转换为"x小时y分钟z秒"情势
------------------------------
FunctionS2T(ByVals)
Dimx,y,z,t
Ifs<1Then
S2T=(s*1000)&"毫秒"
Else
s=Int(s)
x=Int(s/3600)
t=s-3600*x
y=Int(t/60)
z=t-60*y
Ifx>0Then
S2T=x&"小时"&y&"分"&z&"秒"
Else
Ify>0Then
S2T=y&"分"&z&"秒"
Else
S2T=z&"秒"
EndIf
EndIf
EndIf
EndFunction
-----------------------
%>
ASP由于使用了COM组件所以它会变的十分强大,但是这样的强大由于WindowsNT系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失; 另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件) Session:这个存储跟客户端会话过程的数据,默认20分钟失效 ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。 学习是为了用的,是为了让你的程序产生价值,把握住这个原则会比较轻松点。除此之外,课外时间一定要多参加一些社会实践活动,来锻炼自己的能力。 Session:这个存储跟客户端会话过程的数据,默认20分钟失效 封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。 不能只是将它停留在纸上谈兵的程度上。 我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。
页:
[1]