ASP下通过Adodb.Stream实现多线程下载大文件
有个朋友 做 某种小众音乐交换站的(他们那个行业的昵图网),需要用到付费下载。尝试过 防盗链,不太理想,最终使用了 Adodb.Stream 读取,直接输出。
解决了 盗版的问题,但是新的问题又来了。Adodb.Stream 这种方式 电脑还好说,大部分电脑浏览器都支持。移动端 很多 浏览器为了 加速读取,会多线程下载导致 文件无法正常读取。
抓包,发现增加了 HTTP头 HTTP_RANGE。隐约记得 之前读过 王大(王洪影)的 《深入解析 ASP核心技术》当中提到ASP多线程下载的问题,回家翻出来,最终还就真解决了。
为了 方便调用,直接写成了 一个 函数。没用王大的代码,感觉我自己的更美(自恋中…)。如有有需要的朋友需要,直接拿走即可,代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
option explicit
'inputFile 需要下载的文件
'outputName 输出文件名,可以为空,为空时自动根据 inputFile 生成
Sub CreateDownloader(byval inputFile, byval outputName)
Dim filePath
filePath = Server.Mappath(inputFile)
If outputName = "" Then outputName = Split(filePath, "")(UBound(Split(filePath, "")))
'下载开始
Dim AdoStream, bufferSize
Set AdoStream = Server.CreateObject("Adodb.Stream") 'Adodb.Stream,实例变量名为了方便区分用大写
bufferSize = 2 * 1024 * 1024 '每次读取大小(byte) 2M
AdoStream.Mode = 3 '1 读,2 写,3 读写
AdoStream.Type = 1 '1 二进制,2 文本
AdoStream.Open
AdoStream.LoadFromFile(filePath) '载入文件
Response.AddHeader "Content-Disposition", "attachment; filename=" & outputName '文件名
Response.ContentType = "application/octet-stream" '通知浏览器接受的文件类型(可自己定义,很多种,但一般都用这个
Dim httpRange,rangeStart,fileSize
'获取 分段下载 请求
httpRange = Request.ServerVariables("HTTP_RANGE")
fileSize = AdoStream.size '文件总大小
If httpRange = "" Then
'不支持断点续传
rangeStart = 0
Else
'支持断点续传
httpRange = Mid(httpRange, 7)
rangeStart = CLng(Split(httpRange, "-")(0))
If rangeStart < 0 Or rangeStart >= fileSize Then
'已经下载完毕
Response.Status = "416 Requested range not satisfiable"
Else
Response.Status = "206 Partial Content"
Response.AddHeader "Content-Range", "bytes " & rangeStart & "-" & (fileSize - 1) & "/" & fileSize
AdoStream.Position = rangeStart
End If
End If
Dim binaryBlock
If Response.Status <> "416 Requested range not satisfiable" Then
Response.AddHeader "Content-Length", fileSize - rangeStart '通知浏览器接收的文件大小
binaryBlock = AdoStream.Read(bufferSize)
Do While Lenb(binaryBlock) > 0 '循环读取直到读完为止
Response.BinaryWrite binaryBlock '输出二进制数据流
Response.Flush '立即发送(要求至少256字节),不加的话可能提示超过缓存区。
binaryBlock = AdoStream.Read(bufferSize)
Loop
End If
AdoStream.Close '关闭文件对象
Set AdoStream = Nothing
Response.End
End Sub
使用也非常简单,假如上面的代码保存到了 downloader.asp,直接引用即可:
?
1
2
3
4
5
6
7
8
<!--#include file="downloader.asp"-->
<%
'创建下载
call CreateDownloader("down/tools.rar", "")
'创建下载并自定义文件名
call CreateDownloader("down/tools.rar", "hello.rar")
%>
有图有真相:

到此这篇关于ASP下通过Adodb.Stream实现多线程下载大文件的文章就介绍到这了,更多相关ASP多线程下载大文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/asp/8154.shtml
相关文章
热门TAG
命令 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 技巧 权重 服务器 网站流量 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows 蜘蛛 搜索引擎 网站收录 JSP 实例解析最新文章
-
ASP常见错误详解及解决方
时间:2021-01-05
-
查看ASP详细错误提示信息
时间:2021-01-05
-
4款傻瓜型的ASP服务器软件
时间:2020-12-23
-
ASP 数字分页效果代码
时间:2020-12-23
-
asp文件用什么软件编辑
时间:2020-12-23
-
ASP和PHP文件操作速度的对
时间:2020-12-23
-
ASP下通过Adodb.Stream实现多
时间:2020-12-23
-
one.asp多项目、函数库、类
时间:2020-12-23
热门文章
-
查看ASP详细错误提示信息的图文设置方法
时间:2021-01-05
-
one.asp多项目、函数库、类库 统一为一个
时间:2020-12-23
-
ASP下通过Adodb.Stream实现多线程下载大文件
时间:2020-12-23
-
asp在iis7报错行号不准问题的解决方法
时间:2020-12-23
-
4款傻瓜型的ASP服务器软件(asp运行环境一
时间:2020-12-23
-
ASP和PHP文件操作速度的对比
时间:2020-12-23
-
ASP 数字分页效果代码
时间:2020-12-23
-
ASP常见错误详解及解决方案小结
时间:2021-01-05
-
asp文件用什么软件编辑
时间:2020-12-23
