再现理想 发表于 2015-1-16 22:20:58

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系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失;

小女巫 发表于 2015-1-19 09:08:31

另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件)

冷月葬花魂 发表于 2015-1-28 05:59:32

Session:这个存储跟客户端会话过程的数据,默认20分钟失效

小魔女 发表于 2015-2-5 18:37:07

ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。

愤怒的大鸟 发表于 2015-2-13 06:04:44

学习是为了用的,是为了让你的程序产生价值,把握住这个原则会比较轻松点。除此之外,课外时间一定要多参加一些社会实践活动,来锻炼自己的能力。

若天明 发表于 2015-3-3 16:53:31

Session:这个存储跟客户端会话过程的数据,默认20分钟失效

飘灵儿 发表于 2015-3-11 12:27:48

封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。

飘飘悠悠 发表于 2015-3-18 17:36:00

不能只是将它停留在纸上谈兵的程度上。

谁可相欹 发表于 2015-3-26 13:33:17

我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。
页: [1]
查看完整版本: ASP网页设计带进度条的ASP无组件断点续传下载