带进度条的ASP无组件断点续传下载

无组件|下载

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

<%Option Explicit%>                                                

<%

'==================================

''带进度条的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小时%>

<%

Dim RemoteFileUrl'远程文件路径

Dim LocalFileUrl'本地文件路径,相对路径,可以包含/及..

RemoteFileUrl = "http://202.102.14.137/win98.zip"

LocalFileUrl = "win98.zip"

Dim RefererUrl

'该属性设置文件下载的引用页,

'某些网站只允许通过他们网站内的连接下载文件,

'这些网站的服务器判断用户是否是在他们网站内点击的文件链接就是靠这个属性。

RefererUrl = "http://www.skycn.com/crack_skycn.html"'若远程服务器未限制,可留空

Dim BlockSize'分段下载的块大小

Dim BlockTimeout'下载块的超时时间(秒)

BlockSize = 128 * 1024'128K,按1M带宽计算的每秒下载量

(可根据自己的带宽设置,带宽除以8),建议不要设的太小

BlockTimeout = 64'应当根据块的大小来设置。这里设为64秒。

如果128K的数据64秒还下载不完(按每秒2K保守估算),则超时。

Dim PercentTableWidth'进度条总宽度

PercentTableWidth = 560

%>

<%'--------------------以上为设置部分---------------%>

<%

'***********************************

'!!!以下内容无须修改!!!

'***********************************

%>

<%

Dim LocalFileFullPhysicalPath'本地文件在硬盘上的绝对路径

LocalFileFullPhysicalPath = Server.Mappath(LocalFileUrl)

%>

<%

Dim http,ados

On Error Resume Next

Set http = Server.CreateObject("Msxml2.ServerXMLHTTP.7.0")

If Err Then

Err.Clear

Set http = Server.CreateObject("Msxml2.ServerXMLHTTP.6.0")

If Err Then

Err.Clear

Set http = Server.CreateObject("Msxml2.ServerXMLHTTP.5.0")

If Err Then

Err.Clear

Set http = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")

If Err Then

Err.Clear

Set http = Server.CreateObject("Msxml2.ServerXMLHTTP")

If Err Then

Err.Clear

Response.Write "服务器不支持Msxml,本程序无法运行!"

Response.End

End If

End If

End If

End If

End If

On Error Goto 0

Set ados = Server.CreateObject("Adodb.Stream")

%>

<%

Dim RangeStart'分段下载的开始位置

Dim fso

Set fso = Server.CreateObject("Scripting.FileSystemObject")

If fso.FileExists(LocalFileFullPhysicalPath)

Then'判断要下载的文件是否已经存在

RangeStart = fso.GetFile(LocalFileFullPhysicalPath).Size'若存在,以当前文件大小作为开始位置

Else

RangeStart = 0'若不存在,一切从零开始

fso.CreateTextFile(LocalFileFullPhysicalPath).Close'新建文件

End If

Set fso = Nothing

%>

<%

Dim FileDownStart'本次下载的开始位置

Dim FileDownEnd'本次下载的结束位置

Dim FileDownBytes'本次下载的字节数

Dim DownStartTime'开始下载时间

Dim DownEndTime'完成下载时间

Dim DownAvgSpeed'平均下载速度

Dim BlockStartTime'块开始下载时间

Dim BlockEndTime'块完成下载时间

Dim BlockAvgSpeed'块平均下载速度

Dim percentWidth'进度条的宽度

Dim DownPercent'已下载的百分比

FileDownStart = RangeStart

%>

<%

Dim adosCache'数据缓冲区

Dim adosCacheSize'缓冲区大小

Set adosCache = Server.CreateObject("Adodb.Stream")

adosCache.Type = 1'数据流类型设为字节

adosCache.Mode = 3'数据流访问模式设为读写

adosCache.Open

adosCacheSize = 4 * 1024 * 1024'设为4M,

获取的数据先放到(内存)缓冲区中,当缓冲区满的时候数据写入磁盘

'若在自己的电脑上运行本程序,当下载百兆以上级别的大文件的时候,可设置大的缓冲区

'当然,也不要设的太大,免得发生(按下浏览器上的停止按钮或断电等)

意外情况导致缓冲区中的数据没有存盘,那缓冲区中的数据就白下载了

%>

<%

'先显示html头部

Response.Clear

Call HtmlHead()

Response.Flush

%>

<%

Dim ResponseRange'服务器返回的http头中的"Content-Range"

Dim CurrentLastBytes'当前下载的结束位置(即ResponseRange中的上限)

Dim TotalBytes'文件总字节数

Dim temp

'分段下载

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.readyState <> 4)

'判断是否块超时

temp = Timer() - BlockStartTime

If (temp > BlockTimeout) Then

http.abort

Response.Write "<script>document.getElementById(""status"").innerHTML=""<strong>

错误:数据下载超时,建议重试。

</strong>"";</script>" & vbNewLine & "</body></html>"

Call ErrHandler()

Call CloseObject()

Response.End

End If

http.waitForResponse 1000'等待1000毫秒

Wend

'检测状态

If http.status = 416 Then'服务器不能满足客户在请求中指定的Range头。应当是已下载完毕。

FileDownEnd = FileDownStart'设置一下FileDownEnd,免得后面的FileDownBytes计算出错

Call CloseObject()

Exit Do

End If

'检测状态

If http.status > 299 Then'http出错

Response.Write "<script>document.getElementById(""status"").innerHTML=""<strong>http

错误:" & http.status & " " & http.statusText & "</strong>"";

</script>" & vbNewLine & "</body></html>"

Call ErrHandler()

Call CloseObject()

Response.End

End If

'检测状态

If http.status <> 206 Then'服务器不支持断点续传

Response.Write "<script>document.getElementById(""status"").innerHTML=""<strong>

错误:服务器不支持断点续传!</strong>"";</script>" & vbNewLine & "</body></html>"

Call ErrHandler()

Call CloseObject()

Response.End

End If

'检测缓冲区是否已满

If adosCache.Size >= adosCacheSize Then

'打开磁盘上的文件

ados.Type = 1'数据流类型设为字节

ados.Mode = 3'数据流访问模式设为读写

ados.Open

ados.LoadFromFile LocalFileFullPhysicalPath'打开文件

ados.Position = ados.Size'设置文件指针初始位置

'将缓冲区数据写入磁盘文件

adosCache.Position = 0

ados.Write adosCache.Read

ados.SaveToFile LocalFileFullPhysicalPath,2'覆盖保存

ados.Close

'缓冲区复位

adosCache.Position = 0

adosCache.SetEOS

End If

'保存块数据到缓冲区中

adosCache.Write http.responseBody'写入数据

'判断是否全部(块)下载完毕

ResponseRange = http.getResponseHeader("Content-Range")'获得http头中的"Content-Range"

If ResponseRange = "" Then'没有它就不知道下载完了没有

Response.Write "<script>document.getElementById(""status"").innerHTML=""<strong>

错误:文件长度未知!</strong>"";</script>" & vbNewLine & "</body></html>"

Call CloseObject()

Response.End

End If

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是文件总字节数

If TotalBytes - CurrentLastBytes = 1 Then

FileDownEnd = TotalBytes

'将缓冲区数据写入磁盘文件

ados.Type = 1'数据流类型设为字节

ados.Mode = 3'数据流访问模式设为读写

ados.Open

ados.LoadFromFile LocalFileFullPhysicalPath'打开文件

ados.Position = ados.Size'设置文件指针初始位置

adosCache.Position = 0

ados.Write adosCache.Read

ados.SaveToFile LocalFileFullPhysicalPath,2'覆盖保存

ados.Close

Response.Write "<script>document.getElementById

(""downsize"").innerHTML=""" & TotalBytes & """;

</script>" & vbNewLine

Response.Flush

Call CloseObject()

Exit Do'结束位置比总大小少1就表示传输完成了

End If

'调整块开始位置,准备下载下一个块

RangeStart = RangeStart + BlockSize

'计算块下载速度、进度条宽度、已下载的百分比

BlockEndTime = Timer()

temp = (BlockEndTime - BlockStartTime)

If temp > 0 Then

BlockAvgSpeed = Int(BlockSize / 1024 / temp)

Else

BlockAvgSpeed = ""

End If

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

Loop While Response.IsClientConnected

If Not Response.IsClientConnected Then

Response.End

End If

DownEndTime = Now()

FileDownBytes = FileDownEnd - FileDownStart

temp = DateDiff("s",DownStartTime,DownEndTime)

If (FileDownBytes <> 0) And (temp <> 0) Then

DownAvgSpeed = Int((FileDownBytes / 1024) / temp)

Else

DownAvgSpeed = ""

End If

'全部下载完毕后更新进度条

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>

<%

Sub CloseObject()

Set ados = Nothing

Set http = Nothing

adosCache.Close

Set adosCache = Nothing

End Sub

%>

<%

'http异常退出处理代码

Sub ErrHandler()

Dim fso

Set fso = Server.CreateObject("Scripting.FileSystemObject")

If fso.FileExists(LocalFileFullPhysicalPath) Then'判断要下载的文件是否已经存在

If fso.GetFile(LocalFileFullPhysicalPath).Size = 0 Then'若文件大小为0

fso.DeleteFile LocalFileFullPhysicalPath'删除文件

End If

End If

Set fso = Nothing

End Sub

%>

<%Sub HtmlHead()%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>带进度条的ASP无组件断点续传下载----作者:午夜狂龙(Madpolice)--2005.12.25</title>

</head>

<body>

<div id="status">正在下载 <span style="color:blue">

<%=RemoteFileUrl%></span> ,请稍候...</div>

<div> </div>

<div id="progress">已完成:<span id="downpercent" style="color:green">

</span> <span id="downsize" style="color:red"><%=RangeStart%>

</span> / <span id="totalbytes" style="color:blue">

</span> 字节(<span id="blockavgspeed"></span>K/秒)</div>

<div> </div>

<div id="percent" align="center" style="display:''">

<table style="border-collapse:collapse;" border="1" bordercolor="#666666"

cellpadding="0" cellspacing="0"

width="<%=PercentTableWidth%>"

align="center" bgcolor="#eeeeee">

<tr height="20">

<td>

<table border="0" width="" cellspacing="1" bgcolor="#0033FF" id="percentdone">

<tr>

<td> <td>

</tr>

</table>

</td>

</tr>

</table>

</div>

<%End Sub%>

<%

'------------------------------

'将秒数转换为"x小时y分钟z秒"形式

'------------------------------

Function S2T(ByVal s)

Dim x,y,z,t

If s < 1 Then

S2T = (s * 1000) & "毫秒"

Else

s = Int(s)

x = Int(s / 3600)

t = s - 3600 * x

y = Int(t / 60)

z = t - 60 * y

If x > 0 Then

S2T = x & "小时" & y & "分" & z & "秒"

Else

If y > 0 Then

S2T = y & "分" & z & "秒"

Else

S2T = z & "秒"

End If

End If

End If

End Function

'-----------------------

%>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, response
, innerhtml
, 缓冲进度条
, document
, status
, getelementbyid
, response status
, totalbytes
设置innerHTML
asp.net 断点续传、asp.net mvc 断点续传、asp无组件上传、asp无组件上传图片、asp无组件上传源码,以便于您获取更多的相关知识。

时间: 2024-08-03 13:53:40

带进度条的ASP无组件断点续传下载的相关文章

Asp无组件上传带进度条(续)

上传|无组件 几个月前,写过一篇关于Asp无组件上传带进度条的Blog,当时主要分析了一下通过Web文件上传并在后台获取分析数据的实现原理.其中实现进度条的根本就是要实现分块获取数据,根据分块大小和块数记录已上传大小.还有一些具体的细节问题当时并没有说清楚: Q: 进度信息如何访问?A: 进度信息保存在Application中,每次上传时生成一个进度ID,根据这个进度ID可以检索Application中的当前上传进度信息. Q: 进度信息以什么形式保存在Application中?A: Asp太弱

asp无组件上传带真实进度条

  asp无组件上传带真实进度条无组件上传带真实进度条 其中 upload.asp为核心代码,除非特殊需要,一般不需要修改 demo.htm是演示无刷新进度条(IE5.5+支持) demo.asp为处理demo.asp上传的文件,因为演示需要,在Demo.asp中仅仅上传,不作保存,如果需要保存,只需去掉相关注释即可. Example_Normal.htm,一个普通的上传的例子 Example_Normal_RadomFilename.htm, 一个保存将上传文件命名为随机文件名的例子 Exam

ASP实现带进度条测试网速的代码程序

ASP实现带进度条的测试网速. 把下列代码存为xxx.ASP的文件,放在你的服务器上就可以直接运行了. <% Response.Expires = 0 Response.Expiresabsolute = Now() - 1 Response.AddHeader "pragma","no-cache" Response.AddHeader "cache-control","private" Response.CacheC

Asp.net中带进度条的批量静态页生成

asp.net|静态 Asp.net中带进度条的批量静态页生成 namespace WDFROG.BLL...{    public delegate void CreateHtmlHandler(string fileName,string msg,int percent );    public class News    ...{        private const string C_ERR_MSG = "You have no rights!";        priva

QFaces1.2 --Ajax方式,带进度条的文件上传组件FileUpload(for JSF)

这是QFaces的第4个组件,Ajax方式带进度条的文件上传组件,我希望每一个重要组件都提升一个版本, 呵呵!这个版本同时修正了ie6下的ajax兼容问题.在介绍完这个组件之后,打算介绍一下如何利用QFaces自 定义自己的Ajax组件,希望这个增强框架能对喜欢JSF的人有一些帮助.后面版本的升级可能就不会这么快, 或者考虑兼容一下facelets,并修正一些可能出现的错误,还有开源计划,然后继续维护并增加一些比较常 用与实用的组件,关注一下JSF2.0的发展等等. 好了,下面介绍一下QFace

asp.net单文件带进度条上传的解决方案_实用技巧

最近做项目中遇到很多问题,比如带进度条的文件上传,看了网上很多资料还没找到真正意义上的ASP.NET实现进度条上传(可能是我没找到),下面我来跟大家分享一下我实现的这个程序. 首先看下界面效果,当然你可以完全修改界面为你自己所用. 先解释一下这个程序,该程序采用了jquery框架,实现了小文件上传,不超过80Mb,可以在web.config文件中进行相应的配置,但是有个最大值,具体需要查看msdn.开发环境采用visual studio 2013 .net framework 4.5,运行的时候

asp.net文件上传带进度条实现案例(多种风格)_实用技巧

先饱饱眼福: 在之前的文章中也有类似带进度条文件传送的案例,大家可以翻阅之前的文章对知识点进行扩充. 部分代码: <%@ Page Language="C#" %> <%@ Register Assembly="MattBerseth.WebControls.AJAX" Namespace="MattBerseth.WebControls.AJAX.Progress" TagPrefix="mb" %>

PHP+Ajax无刷新带进度条图片上传示例

项目需求:1.PHP+Ajax无刷新带进度条图片上传,2.带进度条.所需插件:jquery.js,jquery.form.js. 最近在做一个手机web项目,需要用到Ajax上传功图片能,项目要求PHP无刷新上传图片,并且要带进度条,下面就来讲一下我的实现方法,先看效果图 本示例需要使用的是jquery.js,jquery.form.js,demo里面包含有,你可以在文章下方进行下载. 第一步,建立前端页面index.html 此段是前端展示内容,这里需要说明的是由于input:file标签显示

ASP.NET实现带进度条的文件上传(多种风格)

文件上传 带进度条 多种风格 非常漂亮!