仓酷云

标题: ASP网页设计带进度条的ASP无组件断点续传下载 [打印本页]

作者: 再现理想    时间: 2015-1-16 22:20
标题: ASP网页设计带进度条的ASP无组件断点续传下载
ASP最大的缺点在于网络的安全性和可靠性,企业将经营数据放在开放的平台上,最大的担忧就是如何保证这些数据不被其他人破坏。无组件|下载
  1. <%@LANGUAGE="VBSCRIPT"CODEPAGE="936"%>
  2. <%OptionExplicit%><%
  3. ==================================
  4. 带进度条的ASP无组件断点续传下载
  5. ==================================
  6. 简介:
  7. 1)使用xmlhttp体例
  8. 2)无组件
  9. 3)异步体例猎取,节俭服务器资本
  10. 4)服务器到服务器的文件传送。(固然,你本人电脑上的IIS也是http服务器)
  11. 5)撑持断点续传
  12. 6)分段下载
  13. 7)利用缓冲区,提拔下载速率
  14. 8)撑持年夜文件下载(速率我就不说了,你能够测,用现实措辞)
  15. 9)带进度条:下载百分比、下载量、立即下载速率、均匀下载速率
  16. 用法:
  17. 设置好上面的三个变量,RemoteFileUrl、LocalFileUrl、RefererUrl
  18. 半夜狂龙(Madpolice)
  19. madpolice_dong@163.com
  20. 2005.12.25
  21. ===============================%>
  22. <%------------为设置部分------
  23. <%Server.Scripttimeout=24*60*60剧本超时设置,这里设为24小时%>
  24. <%
  25. DimRemoteFileUrl远程文件路径
  26. DimLocalFileUrl当地文件路径,绝对路径,能够包括/及..
  27. RemoteFileUrl="http://202.102.14.137/win98.zip"
  28. LocalFileUrl="win98.zip"
  29. DimRefererUrl
  30. 该属性设置文件下载的援用页,
  31. 某些网站只同意经由过程他们网站内的毗连下载文件,
  32. 这些网站的服务器判别用户是不是是在他们网站内点击的文件链接就是靠这个属性。
  33. RefererUrl="http://www.skycn.com/crack_skycn.html"若远程服务器未限定,可留空
  34. DimBlockSize分段下载的块巨细
  35. DimBlockTimeout下载块的超不时间(秒)
  36. BlockSize=128*1024128K,按1M带宽盘算的每秒下载量
  37. (可依据本人的带宽设置,带宽除以8),倡议不要设的太小
  38. BlockTimeout=64应该依据块的巨细来设置。这里设为64秒。
  39. 假如128K的数据64秒还下载不完(按每秒2K守旧预算),则超时。
  40. DimPercentTableWidth进度条总宽度
  41. PercentTableWidth=560
  42. %>
  43. <%--------------------以上为设置部分---------------%>
  44. <%
  45. ***********************************
  46. !!!以下内容不必修正!!!
  47. ***********************************
  48. %>
  49. <%
  50. DimLocalFileFullPhysicalPath当地文件在硬盘上的相对路径
  51. LocalFileFullPhysicalPath=Server.Mappath(LocalFileUrl)
  52. %>
  53. <%
  54. Dimhttp,ados
  55. OnErrorResumeNext
  56. Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.7.0")
  57. IfErrThen
  58. Err.Clear
  59. Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.6.0")
  60. IfErrThen
  61. Err.Clear
  62. Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.5.0")
  63. IfErrThen
  64. Err.Clear
  65. Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
  66. IfErrThen
  67. Err.Clear
  68. Sethttp=Server.CreateObject("Msxml2.ServerXMLHTTP")
  69. IfErrThen
  70. Err.Clear
  71. Response.Write"服务器不撑持Msxml,本程序没法运转!"
  72. Response.End
  73. EndIf
  74. EndIf
  75. EndIf
  76. EndIf
  77. EndIf
  78. OnErrorGoto0
  79. Setados=Server.CreateObject("[u]Adodb.Stream[/u]")
  80. %>
  81. <%
  82. DimRangeStart分段下载的入手下手地位
  83. Dimfso
  84. Setfso=Server.CreateObject("Scripting.FileSystemObject")
  85. Iffso.FileExists(LocalFileFullPhysicalPath)
  86. Then判别要下载的文件是不是已存在
  87. RangeStart=fso.GetFile(LocalFileFullPhysicalPath).Size若存在,以以后文件巨细作为入手下手地位
  88. Else
  89. RangeStart=0若不存在,统统从零入手下手
  90. fso.CreateTextFile(LocalFileFullPhysicalPath).Close新建文件
  91. EndIf
  92. Setfso=Nothing
  93. %>
  94. <%
  95. DimFileDownStart本次下载的入手下手地位
  96. DimFileDownEnd本次下载的停止地位
  97. DimFileDownBytes本次下载的字节数
  98. DimDownStartTime入手下手下载工夫
  99. DimDownEndTime完成下载工夫
  100. DimDownAvgSpeed均匀下载速率
  101. DimBlockStartTime块入手下手下载工夫
  102. DimBlockEndTime块完成下载工夫
  103. DimBlockAvgSpeed块均匀下载速率
  104. DimpercentWidth进度条的宽度
  105. DimDownPercent已下载的百分比
  106. FileDownStart=RangeStart
  107. %>
  108. <%
  109. DimadosCache数据缓冲区
  110. DimadosCacheSize缓冲区巨细
  111. SetadosCache=Server.CreateObject("[u]Adodb.Stream[/u]")
  112. adosCache.Type=1数据流范例设为字节
  113. adosCache.Mode=3数据流会见形式设为读写
  114. adosCache.Open
  115. adosCacheSize=4*1024*1024设为4M,
  116. 猎取的数据先放到(内存)缓冲区中,当缓冲区满的时分数据写进磁盘
  117. 若在本人的电脑上运转本程序,当下载百兆以下级其余年夜文件的时分,可设置年夜的缓冲区
  118. 固然,也不要设的太年夜,以免产生(按下扫瞄器上的中断按钮或断电等)
  119. 不测情形招致缓冲区中的数据没有存盘,那缓冲区中的数据就白下载了
  120. %>
  121. <%
  122. 先显现html头部
  123. Response.Clear
  124. CallHtmlHead()
  125. Response.Flush
  126. %>
  127. <%
  128. DimResponseRange服务器前往的http头中的"Content-Range"
  129. DimCurrentLastBytes以后下载的停止地位(即ResponseRange中的下限)
  130. DimTotalBytes文件总字节数
  131. Dimtemp
  132. 分段下载
  133. DownStartTime=Now()
  134. Do
  135. BlockStartTime=Timer()
  136. http.open"GET",RemoteFileUrl,true,"",""用异步体例挪用serverxmlhttp
  137. 机关http头
  138. http.setRequestHeader"Referer",RefererUrl
  139. http.setRequestHeader"Accept","*/*"
  140. http.setRequestHeader"User-Agent","Baiduspider+(
  141. +http://www.baidu.com/search/spider.htm)"假装成Baidu
  142. http.setRequestHeader"User-Agent","Googlebot/2.1(
  143. +http://www.google.com/bot.html)"假装成Google
  144. http.setRequestHeader"Range","bytes=
  145. "&RangeStart&"-"&Cstr(RangeStart+BlockSize-1)分段关头
  146. http.setRequestHeader"Content-Type","[u]application[/u]/octet-stream"
  147. http.setRequestHeader"Pragma","no-cache"
  148. http.setRequestHeader"Cache-Control","no-cache"
  149. http.send发送
  150. 轮回守候数据吸收
  151. While(http.readyState4)
  152. 判别是不是块超时
  153. temp=Timer()-BlockStartTime
  154. If(temp>BlockTimeout)Then
  155. http.abort
  156. Response.Write"<script>document.getElementById(""status"").[u]innerHTML[/u]=""<strong>
  157. 毛病:数据下载超时,倡议重试。
  158. </strong>"";</script>"&vbNewLine&"</body></html>"
  159. CallErrHandler()
  160. CallCloseObject()
  161. Response.End
  162. EndIf
  163. http.waitForResponse1000守候1000毫秒
  164. Wend
  165. 检测形态
  166. Ifhttp.status=416Then服务器不克不及满意客户在哀求中指定的Range头。应该是已下载终了。
  167. FileDownEnd=FileDownStart设置一下FileDownEnd,以免前面的FileDownBytes盘算堕落
  168. CallCloseObject()
  169. ExitDo
  170. EndIf
  171. 检测形态
  172. Ifhttp.status>299Thenhttp堕落
  173. Response.Write"<script>document.getElementById(""status"").[u]innerHTML[/u]=""<strong>http
  174. 毛病:"&http.status&""&http.statusText&"</strong>"";
  175. </script>"&vbNewLine&"</body></html>"
  176. CallErrHandler()
  177. CallCloseObject()
  178. Response.End
  179. EndIf
  180. 检测形态
  181. Ifhttp.status206Then服务器不撑持断点续传
  182. Response.Write"<script>document.getElementById(""status"").[u]innerHTML[/u]=""<strong>
  183. 毛病:服务器不撑持断点续传!</strong>"";</script>"&vbNewLine&"</body></html>"
  184. CallErrHandler()
  185. CallCloseObject()
  186. Response.End
  187. EndIf
  188. 检测缓冲区是不是已满
  189. IfadosCache.Size>=adosCacheSizeThen
  190. 翻开磁盘上的文件
  191. ados.Type=1数据流范例设为字节
  192. ados.Mode=3数据流会见形式设为读写
  193. ados.Open
  194. ados.LoadFromFileLocalFileFullPhysicalPath翻开文件
  195. ados.Position=ados.Size设置文件指针初始地位
  196. 将缓冲区数据写进磁盘文件
  197. adosCache.Position=0
  198. ados.WriteadosCache.Read
  199. ados.SaveToFileLocalFileFullPhysicalPath,2掩盖保留
  200. ados.Close
  201. 缓冲区复位
  202. adosCache.Position=0
  203. adosCache.SetEOS
  204. EndIf
  205. 保留块数据到缓冲区中
  206. adosCache.Writehttp.responseBody写进数据
  207. 判别是不是全体(块)下载终了
  208. ResponseRange=http.getResponseHeader("Content-Range")取得http头中的"Content-Range"
  209. IfResponseRange=""Then没有它就不晓得下载完了没有
  210. Response.Write"<script>document.getElementById(""status"").[u]innerHTML[/u]=""<strong>
  211. 毛病:文件长度未知!</strong>"";</script>"&vbNewLine&"</body></html>"
  212. CallCloseObject()
  213. Response.End
  214. EndIf
  215. temp=Mid(ResponseRange,Instr(ResponseRange,"-")+1)Content-Range是相似123-456/789的模样
  216. CurrentLastBytes=Clng(Left(temp,Instr(temp,"/")-1))123是入手下手地位,456是停止地位
  217. TotalBytes=Clng(Mid(temp,Instr(temp,"/")+1))789是文件总字节数
  218. IfTotalBytes-CurrentLastBytes=1Then
  219. FileDownEnd=TotalBytes
  220. 将缓冲区数据写进磁盘文件
  221. ados.Type=1数据流范例设为字节
  222. ados.Mode=3数据流会见形式设为读写
  223. ados.Open
  224. ados.LoadFromFileLocalFileFullPhysicalPath翻开文件
  225. ados.Position=ados.Size设置文件指针初始地位
  226. adosCache.Position=0
  227. ados.WriteadosCache.Read
  228. ados.SaveToFileLocalFileFullPhysicalPath,2掩盖保留
  229. ados.Close
  230. Response.Write"<script>document.getElementById
  231. (""downsize"").[u]innerHTML[/u]="""&TotalBytes&""";
  232. </script>"&vbNewLine
  233. Response.Flush
  234. CallCloseObject()
  235. ExitDo停止地位比总巨细少1就暗示传输完成了
  236. EndIf
  237. 调剂块入手下手地位,筹办下载下一个块
  238. RangeStart=RangeStart+BlockSize
  239. 盘算块下载速率、进度条宽度、已下载的百分比
  240. BlockEndTime=Timer()
  241. temp=(BlockEndTime-BlockStartTime)
  242. Iftemp>0Then
  243. BlockAvgSpeed=Int(BlockSize/1024/temp)
  244. Else
  245. BlockAvgSpeed=""
  246. EndIf
  247. percentWidth=Int(PercentTableWidth*RangeStart/TotalBytes)
  248. DownPercent=Int(100*RangeStart/TotalBytes)
  249. 更新进度条
  250. Response.Write"<script>document.getElementById
  251. (""downpercent"").[u]innerHTML[/u]="""&DownPercent&"%"";
  252. document.getElementById(""downsize"").[u]innerHTML[/u]="""&RangeStart&""";
  253. document.getElementById(""totalbytes"").[u]innerHTML[/u]="""&TotalBytes&""";
  254. document.getElementById(""blockavgspeed"").[u]innerHTML[/u]="""&BlockAvgSpeed&""";
  255. document.getElementById(""percentdone"").style.width="""&percentWidth&""";
  256. </script>"&vbNewLine
  257. Response.Flush
  258. LoopWhileResponse.IsClientConnected
  259. IfNotResponse.IsClientConnectedThen
  260. Response.End
  261. EndIf
  262. DownEndTime=Now()
  263. FileDownBytes=FileDownEnd-FileDownStart
  264. temp=DateDiff("s",DownStartTime,DownEndTime)
  265. If(FileDownBytes0)And(temp0)Then
  266. DownAvgSpeed=Int((FileDownBytes/1024)/temp)
  267. Else
  268. DownAvgSpeed=""
  269. EndIf
  270. 全体下载终了后更新进度条
  271. Response.Write"
  272. <script>document.getElementById(""downpercent"").[u]innerHTML[/u]=""100%"";
  273. document.getElementById(""percentdone"").style.width="""&PercentTableWidth&""";
  274. document.getElementById(""percent"").style.display=""none"";
  275. document.getElementById(""status"").[u]innerHTML[/u]=""<strong>下载终了!
  276. 用时:"&S2T(DateDiff("s",DownStartTime,DownEndTime))&",
  277. 均匀下载速率:"&DownAvgSpeed&"K/秒</strong>"";</script>"&vbNewLine
  278. %>
  279. </body>
  280. </html>
  281. <%
  282. SubCloseObject()
  283. Setados=Nothing
  284. Sethttp=Nothing
  285. adosCache.Close
  286. SetadosCache=Nothing
  287. EndSub
  288. %>
  289. <%
  290. http非常加入处置代码
  291. SubErrHandler()
  292. Dimfso
  293. Setfso=Server.CreateObject("Scripting.FileSystemObject")
  294. Iffso.FileExists(LocalFileFullPhysicalPath)Then判别要下载的文件是不是已存在
  295. Iffso.GetFile(LocalFileFullPhysicalPath).Size=0Then若文件巨细为0
  296. fso.DeleteFileLocalFileFullPhysicalPath删除文件
  297. EndIf
  298. EndIf
  299. Setfso=Nothing
  300. EndSub
  301. %>
  302. <%SubHtmlHead()%>
  303. <html>
  304. <head>
  305. <metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
  306. <title>带进度条的ASP无组件断点续传下载----半夜狂龙(Madpolice)--2005.12.25</title>
  307. </head>
  308. <body>
  309. <divid="status">正鄙人载<spanstyle="color:blue">
  310. <%=RemoteFileUrl%></span>,请稍候...</div>
  311. <div></div>
  312. <divid="progress">已完成:<spanid="downpercent"style="color:green">
  313. </span><spanid="downsize"style="color:red"><%=RangeStart%>
  314. </span>/<spanid="totalbytes"style="color:blue">
  315. </span>字节(<spanid="blockavgspeed"></span>K/秒)</div>
  316. <div></div>
  317. <divid="percent"align="center"style="display:">
  318. <tablestyle="border-collapse:collapse;"border="1"bordercolor="#666666"
  319. cellpadding="0"cellspacing="0"
  320. width="<%=PercentTableWidth%>"
  321. align="center"bgcolor="#eeeeee">
  322. <trheight="20">
  323. <td>
  324. <tableborder="0"width=""cellspacing="1"bgcolor="#0033FF"id="percentdone">
  325. <tr>
  326. <td><td>
  327. </tr>
  328. </table>
  329. </td>
  330. </tr>
  331. </table>
  332. </div>
  333. <%EndSub%>
  334. <%
  335. ------------------------------
  336. 将秒数转换为"x小时y分钟z秒"情势
  337. ------------------------------
  338. FunctionS2T(ByVals)
  339. Dimx,y,z,t
  340. Ifs<1Then
  341. S2T=(s*1000)&"毫秒"
  342. Else
  343. s=Int(s)
  344. x=Int(s/3600)
  345. t=s-3600*x
  346. y=Int(t/60)
  347. z=t-60*y
  348. Ifx>0Then
  349. S2T=x&"小时"&y&"分"&z&"秒"
  350. Else
  351. Ify>0Then
  352. S2T=y&"分"&z&"秒"
  353. Else
  354. S2T=z&"秒"
  355. EndIf
  356. EndIf
  357. EndIf
  358. EndFunction
  359. -----------------------
  360. %>
复制代码
ASP由于使用了COM组件所以它会变的十分强大,但是这样的强大由于WindowsNT系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失;
作者: 小女巫    时间: 2015-1-19 09:08
另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件)
作者: 冷月葬花魂    时间: 2015-1-28 05:59
Session:这个存储跟客户端会话过程的数据,默认20分钟失效
作者: 小魔女    时间: 2015-2-5 18:37
ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。
作者: 愤怒的大鸟    时间: 2015-2-13 06:04
学习是为了用的,是为了让你的程序产生价值,把握住这个原则会比较轻松点。除此之外,课外时间一定要多参加一些社会实践活动,来锻炼自己的能力。
作者: 若天明    时间: 2015-3-3 16:53
Session:这个存储跟客户端会话过程的数据,默认20分钟失效
作者: 飘灵儿    时间: 2015-3-11 12:27
封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。
作者: 飘飘悠悠    时间: 2015-3-18 17:36
不能只是将它停留在纸上谈兵的程度上。
作者: 谁可相欹    时间: 2015-3-26 13:33
我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2