|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
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("[u]Adodb.Stream[/u]")
- %>
- <%
- 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("[u]Adodb.Stream[/u]")
- 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","[u]application[/u]/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"").[u]innerHTML[/u]=""<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"").[u]innerHTML[/u]=""<strong>http
- 毛病:"&http.status&""&http.statusText&"</strong>"";
- </script>"&vbNewLine&"</body></html>"
- CallErrHandler()
- CallCloseObject()
- Response.End
- EndIf
- 检测形态
- Ifhttp.status206Then服务器不撑持断点续传
- Response.Write"<script>document.getElementById(""status"").[u]innerHTML[/u]=""<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"").[u]innerHTML[/u]=""<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"").[u]innerHTML[/u]="""&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"").[u]innerHTML[/u]="""&DownPercent&"%"";
- document.getElementById(""downsize"").[u]innerHTML[/u]="""&RangeStart&""";
- document.getElementById(""totalbytes"").[u]innerHTML[/u]="""&TotalBytes&""";
- document.getElementById(""blockavgspeed"").[u]innerHTML[/u]="""&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"").[u]innerHTML[/u]=""100%"";
- document.getElementById(""percentdone"").style.width="""&PercentTableWidth&""";
- document.getElementById(""percent"").style.display=""none"";
- document.getElementById(""status"").[u]innerHTML[/u]=""<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系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失; |
|