用VB下载文件

本文介绍了一个使用VBA编写的简单网络文件下载器。该下载器能够处理HTTP请求,支持断点续传功能,并显示下载速度及剩余时间等信息。通过解析HTTP头部信息获取文件大小,利用Winsock组件实现数据传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Option Explicit

Dim sRestTime    As Long
Dim dblDownloadSpeed     As Long
Dim FileHeaderLen As Long
Dim StartPos As Long
Dim FileSizeByte As Long
Dim SaveFileName As String
Dim StartTime As Variant
Dim FileSize As Long
Dim FileSizeHaveDown As Long
Dim pst As Long
Dim blnHead As Boolean

Private Sub Command1_Click()
      On Error Resume Next
      Dim strURL As String
      Dim strCommand As String
      Dim Host As String
      Dim strPath As String
      Dim lngFirstSeparator As Long
    
      strURL = Text1.Text
    
      If InStr(1, strURL, "http://", vbTextCompare) = 0 Then
          strURL = "http://" + strURL
      End If
      lngFirstSeparator = InStr(8, strURL, "/", vbTextCompare)
      Host = Mid(strURL, 8, lngFirstSeparator - 8)
      strPath = Right(strURL, Len(strURL) - lngFirstSeparator + 1)
      'Print strPath
      'Print Host
      SaveFileName = Text3.Text
    
      StartTime = Time()
      With Winsck
          .RemoteHost = Host    '远端主机地址
          .RemotePort = 80
          .Connect
          '等待服务器连接相应
          Do While .State <> sckConnected
              DoEvents: DoEvents: DoEvents: DoEvents
              '20秒超时
              If DateDiff("s", StartTime, Time()) > 20 Then
                  Print "连接超时"
                  .Close
                  Exit Sub
              End If
          Loop
          '发送下载文件请求
          '此处使用HTTP/1.0协议
        
'GET /down/WindowHider.rar HTTP/1.1
'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
'Accept -Language: zh -cn
'Accept -Encoding: gzip , deflate
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)
'Host: sxbctv.onlinedown.net
'Connection: Keep -Alive
'Cookie: Flag = UUIISPoweredByUUSoft

          strCommand = "GET " + strPath + " HTTP/1.1" + vbCrLf '***
          strCommand = strCommand + "Accept: */*" + vbCrLf        '这句可以不要
          strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
          'strCommand = strCommand + "Accept -Language: zh -cn" + vbCrLf
          'strCommand = strCommand + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)" + vbCrLf
          strCommand = strCommand + "Referer: " + strURL + ".html" + vbCrLf 'http://nj.onlinedown.net/soft/0000.htm" + vbCrLf
          'strCommand = strCommand + "" + vbCrLf
          'strCommand = strCommand + "" + vbCrLf
          'strCommand = strCommand + vbCrLf
          strCommand = strCommand & "Host: " & Host & vbCrLf
'          If Dir(SaveFileName) <> "" Then '是否已经存在下载文件
'              Dim confirm
'              confirm = MsgBox("已经存在文件,是否断点续传?", vbYesNo + vbQuestion, "提示")
'              If confirm = vbYes Then
'                  DownPosition = ""
'                  If Not oFileCtrl.ReadKeyFromIni("Update", "DownSize", App.Path + "Update.ini", DownPosition) Then
'                  '读取上次下载的字节数
'                      MsgBox "读取大小错误", vbInformation, "提示"
'                  End If
'                  '发送断点续传请求
'                  strCommand = strCommand & "Range: bytes=" & CLng(DownPosition) & "-" & vbCrLf
'              Else
'                  Kill SaveFileName '删除原文件
'              End If
'          End If
          strCommand = strCommand & "Connection: Keep-Alive" & vbCrLf
          strCommand = strCommand & vbCrLf
          .SendData strCommand
      End With
      If Err Then
          lblProcessResult.Caption = lblProcessResult.Caption & vbCrLf & vbCrLf & "下载文件出错:" & Err.Description
          lblProcessResult.Refresh
      End If


End Sub

Private Sub Text1_Change()
      Dim lenURL As Long, strURL As String
      strURL = Text1.Text

      lenURL = Len(strURL)
      Dim i As Long, lngFileNameStart As Long
      For i = lenURL To 1 Step -1
          If Mid(strURL, i, 1) = "/" Then
              lngFileNameStart = i + 1
              Exit For
          End If
      Next i
    
      If lngFileNameStart <> 0 Then Text3.Text = Mid(strURL, lngFileNameStart, lenURL - lngFileNameStart + 1)

End Sub

'--------------------------------------------------------------------------------
'     Name:Winsck_DataArrival
'     Author:Reker 2004/3/20
'     Desc:略
'     Params:略
'     Return:None
'     History:None
'--------------------------------------------------------------------------------
Private Sub Winsck_DataArrival(ByVal bytesTotal As Long)
      On Error Resume Next
      'DoEvents
      Dim ByteData() As Byte
      Dim ReceiveData As Variant
      Winsck.GetData ByteData(), vbByte
      ReceiveData = ReceiveData & StrConv(ByteData(), vbUnicode)
      If InStr(1, ReceiveData, "Content-Length:") > 0 Then    '仅第一次计算,FileSize=0
          Text2.SelStart = 65535
          Text2.SelText = ReceiveData
          blnHead = True
          Dim pos1 As Long, pos2 As Long
          pos1 = InStr(1, ReceiveData, "Content-Length:")
          pos2 = InStr(pos1 + 16, ReceiveData, vbCrLf)
          If pos2 > pos1 Then
              FileSizeByte = Mid(ReceiveData, pos1 + 16, pos2 - pos1 - 16) '计算文件的长度
              StartTime = Timer() '保存开始下载的时间
              'ProgssBar.Max = FileSizeByte '设置进度条
              FileSize = FormatNumber(FileSizeByte / 1024, 2) '以KB表示
              Print "本次下载的文件共" + CStr(FileSize) + "KB..."
          End If
      Else
          blnHead = False
      End If
      '从服务器响应返回的数据查找下载文件的起始位置
      'If FileHeaderLen = 0 Then
          Dim i As Long
          For i = 0 To UBound(ByteData()) - 3
              If ByteData(i) = 13 And ByteData(i + 1) = 10 And ByteData(i + 2) = 13 And ByteData(i + 3) = 10 Then
                  StartPos = i + 4 '将文件头的长度保存下来
                  FileHeaderLen = StartPos
                  pst = FileHeaderLen
                  Exit For
              End If
              'DoEvents
          Next i
      'End If
      FileSizeHaveDown = bytesTotal + FileSizeHaveDown - FileHeaderLen
      '已下载文件长度,需减去响应的文件头长度
      dblDownloadSpeed = FormatNumber(FormatNumber(FileSizeHaveDown / 1024, 2) / (FormatNumber((Timer() - StartTime), 4)), 2)    '计算下载速率 KB/S
      If dblDownloadSpeed <> 0 Then    '计算剩余下载的时间
          sRestTime = CLng((FileSize - (FileSizeHaveDown) / 1024) / dblDownloadSpeed) '此过程略,可以删除此段代码
          labRestTime.Caption = "剩余时间:o" + sRestTime
          labRestTime.Refresh
      End If
      labDownloadSpeed.Caption = CStr(dblDownloadSpeed) + " kb/s"
      labDownloadSpeed.Refresh
      'ProgssBar.Value = FileSizeHaveDown
      '写数据
      Dim Fnum    As Long
      Fnum = FreeFile()
      Open SaveFileName For Binary As #Fnum 'Lock Write As #Fnum
'      If LOF(Fnum) > 0 Then
'          Seek #Fnum, LOF(Fnum) + 1
'      End If
      If blnHead = True Then
          For i = pst To UBound(ByteData())
              Put #Fnum, i - pst + 1, ByteData(i)
          Next i
          pst = UBound(ByteData()) - pst + 1
      Else
          Put #Fnum, pst + 1, ByteData()
          pst = UBound(ByteData()) + pst + 1
      End If
      Close #Fnum
    
      If Err Then
          lblProcessResult.Caption = lblProcessResult.Caption & vbCrLf & vbCrLf & "下载文件出错:" & Err.Description
          lblProcessResult.Refresh
      End If
End Sub

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值