ASP下通过Adodb.Stream实现多线程下载大文件
有个朋友做某种小众音乐交换站的(他们那个行业的昵图网),需要用到付费下载。尝试过防盗链,不太理想,最终使用了Adodb.Stream读取,直接输出。
解决了盗版的问题,但是新的问题又来了。Adodb.Stream这种方式电脑还好说,大部分电脑浏览器都支持。移动端很多浏览器为了加速读取,会多线程下载导致文件无法正常读取。
抓包,发现增加了HTTP头HTTP_RANGE。隐约记得之前读过王大(王洪影)的《深入解析ASP核心技术》当中提到ASP多线程下载的问题,回家翻出来,最终还就真解决了。
为了方便调用,直接写成了一个函数。没用王大的代码,感觉我自己的更美(自恋中…)。如有有需要的朋友需要,直接拿走即可,代码如下:
optionexplicit
'inputFile需要下载的文件
'outputName输出文件名,可以为空,为空时自动根据inputFile生成
SubCreateDownloader(byvalinputFile,byvaloutputName)
DimfilePath
filePath=Server.Mappath(inputFile)
IfoutputName=""ThenoutputName=Split(filePath,"\")(UBound(Split(filePath,"\")))
'下载开始
DimAdoStream,bufferSize
SetAdoStream=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"'通知浏览器接受的文件类型(可自己定义,很多种,但一般都用这个
DimhttpRange,rangeStart,fileSize
'获取分段下载请求
httpRange=Request.ServerVariables("HTTP_RANGE")
fileSize=AdoStream.size'文件总大小
IfhttpRange=""Then
'不支持断点续传
rangeStart=0
Else
'支持断点续传
httpRange=Mid(httpRange,7)
rangeStart=CLng(Split(httpRange,"-")(0))
IfrangeStart<0OrrangeStart>=fileSizeThen
'已经下载完毕
Response.Status="416Requestedrangenotsatisfiable"
Else
Response.Status="206PartialContent"
Response.AddHeader"Content-Range","bytes"&rangeStart&"-"&(fileSize-1)&"/"&fileSize
AdoStream.Position=rangeStart
EndIf
EndIf
DimbinaryBlock
IfResponse.Status<>"416Requestedrangenotsatisfiable"Then
Response.AddHeader"Content-Length",fileSize-rangeStart'通知浏览器接收的文件大小
binaryBlock=AdoStream.Read(bufferSize)
DoWhileLenb(binaryBlock)>0'循环读取直到读完为止
Response.BinaryWritebinaryBlock'输出二进制数据流
Response.Flush'立即发送(要求至少256字节),不加的话可能提示超过缓存区。
binaryBlock=AdoStream.Read(bufferSize)
Loop
EndIf
AdoStream.Close'关闭文件对象
SetAdoStream=Nothing
Response.End
EndSub
使用也非常简单,假如上面的代码保存到了downloader.asp,直接引用即可:
<%
'创建下载
callCreateDownloader("down/tools.rar","")
'创建下载并自定义文件名
callCreateDownloader("down/tools.rar","hello.rar")
%>
有图有真相:
到此这篇关于ASP下通过Adodb.Stream实现多线程下载大文件的文章就介绍到这了,更多相关ASP多线程下载大文件内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。