ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1058|回复: 0

[转帖] 大文件断点续传的方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-4-10 18:52 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

在下载的时候只要在请求头“Range”中设置“bytes=开始字节-结束字节”。就可以下载指定块(不是所有网站都支持),下面是找到的一段代码,虽然不实用,但是完整的演示了原理。
备注:在用OPEN的Binary 模式打开文件时,可以任意指定读写文件位置,也就是可以设置文件读写指针,这个指针是整数类型,最大范围不能超过2G,由于VB没有无符号整数,所以最大只能在1G多,如果超过1G的文件只能用别的方法解决。


下面是网友“lyserver”的代码
Dim m_blnStop As Boolean
Private Type BlockInfo
    FlagSucceed As Boolean
    FlagDone As Boolean
    FlagAddProcess As Boolean
    Start As Long
    End As Long
    index As Long
End Type

Private Sub Command1_Click()
    '下载,由于在局域网内测试,因此分块设置较大(400K)
    Dim t
    t = Timer
    DownFileByHTTP Text1.Text, Text2.Text, 4096 * 5, True
    Debug.Print Timer - t
    If m_blnStop = True Then
        MsgBox "数据下载被中断!", vbCritical, "提示"
    Else
        MsgBox "数据下载完毕!", vbInformation, "提示"
    End If
End Sub

'* -------------------------------------------
' 函数说明:基于XMLHTTP的数据下载函数(支持断点续传)
' 参数说明:URL待下载的URL
'           FileName保存下载结果的文件
'           BlockSize分块大下,根据网络情况而定,以便VB能及时执行DoEvents来获得鼠标和键盘动作并刷新界面
'           ResumeTransfer是否支持断点续传
' 编码:lyserver
'* -------------------------------------------
Private Sub DownFileByHTTP(ByVal Url As String, FileName As String, Optional BlockSize As Long = 4096, Optional ResumeTransfer As Boolean)
    Dim xmlHttp As Object
    Dim bytData() As Byte
    Dim i As Long, fn As Integer, lTotalSize As Long

    '获得文件长度
    Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
    xmlHttp.Open "HEAD", Url, False
    xmlHttp.Send
    lTotalSize = xmlHttp.GetResponseHeader("Content-Length")
    Debug.Print lTotalSize / 1024
    Debug.Print Len(xmlHttp.ResponseBody)
    Set xmlHttp = Nothing

    '打开文件
    fn = FreeFile()
    Open FileName For Binary As #fn

    '判断是否需要断点续传
    If ResumeTransfer = True Then
        i = LOF(fn)
        Seek fn, i + 1
    End If

    '分块下载数据,并保存到文件中
    m_blnStop = False '重置中断标志
    Do While i < lTotalSize And m_blnStop = False '没有使用For循环是因为需要下载数与实际下载数可能不一致
        '获得文件数据

        Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
        xmlHttp.Open "GET", Url, False
        xmlHttp.SetRequestHeader "Referer", Left(Url, InStr(InStr(Url, "//") + 2, Url, "/") - 1)
        xmlHttp.SetRequestHeader "Accept", "*/*"
        xmlHttp.SetRequestHeader "User-Agent", "lyserver" '"Baiduspider+(+http://www.baidu.com/search/spider.htm)"
        xmlHttp.SetRequestHeader "Range", "bytes=" & i & "-" & CStr(i + IIf(lTotalSize - i > BlockSize, BlockSize, lTotalSize - i) - 1) '分段
        xmlHttp.SetRequestHeader "Content-Type", "application/octet-stream"
        xmlHttp.SetRequestHeader "Pragma", "no-cache"
        xmlHttp.SetRequestHeader "Cache-Control", "no-cache"
        xmlHttp.Send
        '转换为字节数组
        bytData = xmlHttp.ResponseBody
'        Debug.Print UBound(bytData), Len(xmlHttp.ResponseBody)
        Set xmlHttp = Nothing
        '保存到文件中
        Put fn, , bytData
        '重置下载开始位置
        i = i + UBound(bytData) + 1
        '释放控制权
        DoEvents
        '显示进度
        Debug.Print VBA.FormatPercent(i / lTotalSize)
    Loop
    Close fn
End Sub



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 09:24 , Processed in 0.036172 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表