基于HTTP协议用WinSock实现任意文件下载
2005-04-12 19:30
381 查看
HTTP协议是文本格式通讯,下载文件是二进制数据,怎样处理好两种格式,而不受VB独断专行的Unicode转换影响,本代码提供了一个示例。
Option Explicit
Private strURL As String
Private mstrFileName As String, mlngFileNum As Long
Private mlngFileLen As Long, mlngCurByte As Long
Private mblnOnlyLen As Boolean, mblnPutStart As Boolean
Private Sub Form_Load()
Text1.Text = ""
Text2.Text = ""
Label1.Caption = "文件总字节:0"
Label2.Caption = "已下载字节:0"
Command1.Caption = "开始下载"
Command2.Caption = "取得长度"
End Sub
Private Sub Command1_Click()
mblnOnlyLen = False
DownFile
End Sub
Private Sub Command2_Click()
If Command2.Caption = "取消" Then
Command2.Caption = "取得长度"
CloseAll
Else
mblnOnlyLen = True
Label1.Caption = "文件总字节:0"
DownFile
End If
End Sub
Private Sub DownFile()
Dim Server As String, Port As Long
Dim i As Long, j As Long, s As String
strURL = Text1.Text '准备下载的文件URL
If strURL = "" Then MsgBox "请输入URL!"
j = InStr(1, strURL, "http://", vbTextCompare)
If j > 0 Then
j = j + 7
Else
j = 1
End If
i = InStr(j, strURL, "/")
If i > 0 Then
Server = Mid(strURL, j, i - j)
Else
MsgBox "无效的URL!"
Exit Sub
End If
i = InStr(1, Server, ":")
If i > 0 Then
Port = Val(Mid(Server, i + 1))
Server = Left(Server, i - 1)
strURL = Replace(strURL, ":" & Port, "", , 1)
Else
Port = 80
End If
mstrFileName = Text2.Text '下载文件在本存放的位置与文件名
If mstrFileName = "" Then
mstrFileName = App.Path & "/" & Mid$(strURL, InStrRev(strURL, "/") + 1)
Else
i = InStrRev(mstrFileName, "/")
If i > 0 Then
s = Left$(mstrFileName, i - 1)
If Dir(s, vbDirectory) = "" Then
MsgBox "请输入文件存放路径!"
End If
Else
mstrFileName = App.Path & "/" & mstrFileName
End If
End If
mblnPutStart = False
Label2.Caption = "已下载字节:0"
Command1.Enabled = False
Command2.Caption = "取消"
With Winsock1
If .State <> sckClosed Then .Close
.Protocol = sckTCPProtocol
.RemoteHost = Server
.RemotePort = Port
.Connect
End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
CloseAll
End Sub
Private Sub Winsock1_Connect()
Dim s As String
s = "GET " & strURL & " HTTP/1.0" + vbCrLf
s = s & "Accept: */*" & vbCrLf
s = s & "Pragma: no-cache" & vbCrLf
s = s & "Cache-Control: no-cache" & vbCrLf
s = s & "Connection: close" & vbCrLf & vbCrLf
s = s & vbCrLf
Winsock1.SendData s
End Sub
Private Sub CloseAll()
If Winsock1.State <> sckClosed Then Winsock1.Close
Close #mlngFileNum
Command1.Enabled = True
Command2.Caption = "取得长度"
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim RevData() As Byte
Dim a() As Byte, b() As String, c() As String
Dim s As String, i As Long, k As Long
On Error GoTo fail
If mblnPutStart = False Then
Winsock1.PeekData RevData, vbArray Or vbByte
k = InStrB(1, RevData, ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10))
If k > 0 Then
Winsock1.GetData RevData, vbArray Or vbByte
a = LeftB(RevData, k - 1)
RevData = MidB(RevData, k + 4)
s = StrConv(a, vbUnicode)
b = Split(s, vbCrLf)
If InStr(1, b(0), "200 OK", vbTextCompare) = 0 Then GoTo fail
For i = 1 To UBound(b)
c = Split(b(i), ": ")
Select Case c(0)
Case "Content-Length"
mlngFileLen = CLng(c(1))
Label1.Caption = "文件总字节:" & mlngFileLen
If mblnOnlyLen Then
CloseAll
Exit Sub
End If
End Select
Next
mblnPutStart = True
mlngCurByte = UBound(RevData) + 1
mlngFileNum = FreeFile
If Dir(mstrFileName) <> "" Then Kill mstrFileName
Open mstrFileName For Binary As #mlngFileNum
Else
Exit Sub
End If
Else
Winsock1.GetData RevData, vbArray Or vbByte
mlngCurByte = mlngCurByte + bytesTotal
End If
Put #mlngFileNum, , RevData
Label2.Caption = "已下载字节:" & mlngCurByte
If mlngCurByte = mlngFileLen Then
CloseAll
MsgBox "下载成功!"
End If
Exit Sub
fail:
CloseAll
MsgBox "网络传输错误,文件下载失败!"
End Sub
Option Explicit
Private strURL As String
Private mstrFileName As String, mlngFileNum As Long
Private mlngFileLen As Long, mlngCurByte As Long
Private mblnOnlyLen As Boolean, mblnPutStart As Boolean
Private Sub Form_Load()
Text1.Text = ""
Text2.Text = ""
Label1.Caption = "文件总字节:0"
Label2.Caption = "已下载字节:0"
Command1.Caption = "开始下载"
Command2.Caption = "取得长度"
End Sub
Private Sub Command1_Click()
mblnOnlyLen = False
DownFile
End Sub
Private Sub Command2_Click()
If Command2.Caption = "取消" Then
Command2.Caption = "取得长度"
CloseAll
Else
mblnOnlyLen = True
Label1.Caption = "文件总字节:0"
DownFile
End If
End Sub
Private Sub DownFile()
Dim Server As String, Port As Long
Dim i As Long, j As Long, s As String
strURL = Text1.Text '准备下载的文件URL
If strURL = "" Then MsgBox "请输入URL!"
j = InStr(1, strURL, "http://", vbTextCompare)
If j > 0 Then
j = j + 7
Else
j = 1
End If
i = InStr(j, strURL, "/")
If i > 0 Then
Server = Mid(strURL, j, i - j)
Else
MsgBox "无效的URL!"
Exit Sub
End If
i = InStr(1, Server, ":")
If i > 0 Then
Port = Val(Mid(Server, i + 1))
Server = Left(Server, i - 1)
strURL = Replace(strURL, ":" & Port, "", , 1)
Else
Port = 80
End If
mstrFileName = Text2.Text '下载文件在本存放的位置与文件名
If mstrFileName = "" Then
mstrFileName = App.Path & "/" & Mid$(strURL, InStrRev(strURL, "/") + 1)
Else
i = InStrRev(mstrFileName, "/")
If i > 0 Then
s = Left$(mstrFileName, i - 1)
If Dir(s, vbDirectory) = "" Then
MsgBox "请输入文件存放路径!"
End If
Else
mstrFileName = App.Path & "/" & mstrFileName
End If
End If
mblnPutStart = False
Label2.Caption = "已下载字节:0"
Command1.Enabled = False
Command2.Caption = "取消"
With Winsock1
If .State <> sckClosed Then .Close
.Protocol = sckTCPProtocol
.RemoteHost = Server
.RemotePort = Port
.Connect
End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
CloseAll
End Sub
Private Sub Winsock1_Connect()
Dim s As String
s = "GET " & strURL & " HTTP/1.0" + vbCrLf
s = s & "Accept: */*" & vbCrLf
s = s & "Pragma: no-cache" & vbCrLf
s = s & "Cache-Control: no-cache" & vbCrLf
s = s & "Connection: close" & vbCrLf & vbCrLf
s = s & vbCrLf
Winsock1.SendData s
End Sub
Private Sub CloseAll()
If Winsock1.State <> sckClosed Then Winsock1.Close
Close #mlngFileNum
Command1.Enabled = True
Command2.Caption = "取得长度"
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim RevData() As Byte
Dim a() As Byte, b() As String, c() As String
Dim s As String, i As Long, k As Long
On Error GoTo fail
If mblnPutStart = False Then
Winsock1.PeekData RevData, vbArray Or vbByte
k = InStrB(1, RevData, ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10))
If k > 0 Then
Winsock1.GetData RevData, vbArray Or vbByte
a = LeftB(RevData, k - 1)
RevData = MidB(RevData, k + 4)
s = StrConv(a, vbUnicode)
b = Split(s, vbCrLf)
If InStr(1, b(0), "200 OK", vbTextCompare) = 0 Then GoTo fail
For i = 1 To UBound(b)
c = Split(b(i), ": ")
Select Case c(0)
Case "Content-Length"
mlngFileLen = CLng(c(1))
Label1.Caption = "文件总字节:" & mlngFileLen
If mblnOnlyLen Then
CloseAll
Exit Sub
End If
End Select
Next
mblnPutStart = True
mlngCurByte = UBound(RevData) + 1
mlngFileNum = FreeFile
If Dir(mstrFileName) <> "" Then Kill mstrFileName
Open mstrFileName For Binary As #mlngFileNum
Else
Exit Sub
End If
Else
Winsock1.GetData RevData, vbArray Or vbByte
mlngCurByte = mlngCurByte + bytesTotal
End If
Put #mlngFileNum, , RevData
Label2.Caption = "已下载字节:" & mlngCurByte
If mlngCurByte = mlngFileLen Then
CloseAll
MsgBox "下载成功!"
End If
Exit Sub
fail:
CloseAll
MsgBox "网络传输错误,文件下载失败!"
End Sub
相关文章推荐
- Android实现基于http协议的文件下载
- Java实现基于http协议的网络文件下载
- 用java实现基于http协议的网络文件下载
- 使用Android的OkHttp包实现基于HTTP协议的文件上传下载
- Java实现基于http协议的网络文件下载
- spring mvc 实现任意文件上传—— 下载<二>
- 基于Retrofit+Okio+RxBus实现文件下载(带下载进度)
- 基于struts2--实现文件上传下载
- 网络编程应用:基于UDP协议【实现文件下载】--练习
- 基于Retrofit+Okio+RxBus实现文件下载(带下载进度)
- C#用HTTP协议实现多线程文件下载和断点续传
- ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)
- 基于Spring Mvc实现的Excel文件上传下载
- 基于tapestry5.0实现的文件下载
- 基于Retrofit+Okio+RxBus实现文件下载(带下载进度)
- 基于struts 的实现文件的下载和删除功能
- 基于HTTP的单线程文件下载功能实现
- 基于Bmob平台的账户登录、文件上传及下载逻辑的实现
- Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载
- 在基于WebSphere JSF 1.2 Portlet Bridge的JSF Portlet中实现文件下载