ASP下通过Adodb.Stream实现多线程下载大文件(文件名.asp)全程干货

随心笔谈2年前发布 admin
204 0 0

文章摘要

本文介绍了一种基于VBScript的文件下载功能实现方法,通过使用ADO对象加载文件并实现分块下载。代码中定义了一个Sub函数CreateDownloader,用于下载指定文件并返回响应。具体步骤包括: 1. 通过`Server.Mappath`获取文件路径,并根据文件名自动生成输出文件名。 2. 使用`Adodb.Stream`对象加载文件,并设置适当的读写模式和类型。 3. 通过`HTTP_RANGE`头处理文件分块下载,支持断点续传功能。 4. 根据文件大小和当前块位置调整响应状态码和内容范围。 5. 使用`Response.BinaryWrite`和`Response.Flush`方法输出二进制数据块。 6. 最后关闭文件对象和响应。 该实现能够支持分块下载并处理断点续传请求。


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

© 版权声明

相关文章