我只需要下载一个http文件,能取消,这样写好像接受了几K就不写入文件了,为什么?
Option Explicit
Dim strCommand As String
Dim strWebPage As StringPrivate Sub Command1_Click()Winsock1.RemoteHost = "http://wsdlyf.myetang.com" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
Winsock1.Connect '返回与远程计算机的连接。
End SubPrivate Sub Command2_Click()
Dim fso As Object
Set fso = CreateObject("scripting.filesystemobject")
fso.Copyfile "http://wsdlyf.myetang.com/ToolsDownload/icon01.rar", "E:\a.rar"
End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。
On Error Resume Next
strWebPage = "http://wsdlyf.myetang.com/ToolsDownload/icon01.rar"
strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令
'strCommand = strCommand + "Accept: */*" + vbCrLf '这句可以不要
'strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
strCommand = strCommand + vbCrLf '记住一定要加上vbCrLfDebug.Print strCommandWinsock1.SendData strCommand ''给远程计算机发送数据End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件
On Error Resume Next '在错误处理程序结束后,恢复原有的运行Dim byt() As Byte
Winsock1.GetData byt(), vbByte + vbArray '检取当前的数据块
Open "E:\Downloads\tmp\0048826\a.rar" For Binary As #1
Put #1, , byt()
Close #1
End Sub
Option Explicit
Dim strCommand As String
Dim strWebPage As StringPrivate Sub Command1_Click()Winsock1.RemoteHost = "http://wsdlyf.myetang.com" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
Winsock1.Connect '返回与远程计算机的连接。
End SubPrivate Sub Command2_Click()
Dim fso As Object
Set fso = CreateObject("scripting.filesystemobject")
fso.Copyfile "http://wsdlyf.myetang.com/ToolsDownload/icon01.rar", "E:\a.rar"
End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。
On Error Resume Next
strWebPage = "http://wsdlyf.myetang.com/ToolsDownload/icon01.rar"
strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令
'strCommand = strCommand + "Accept: */*" + vbCrLf '这句可以不要
'strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
strCommand = strCommand + vbCrLf '记住一定要加上vbCrLfDebug.Print strCommandWinsock1.SendData strCommand ''给远程计算机发送数据End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件
On Error Resume Next '在错误处理程序结束后,恢复原有的运行Dim byt() As Byte
Winsock1.GetData byt(), vbByte + vbArray '检取当前的数据块
Open "E:\Downloads\tmp\0048826\a.rar" For Binary As #1
Put #1, , byt()
Close #1
End Sub
(上面command2没有用的)
接受的数据是
下载文件信息
所以要跳过第一个
从第二个开始写入文件
而且文件长要分多次写入文件
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim WebData() As Byte, sPara As String
Static iPos As Long
If Not FlagSave Then
Winsock1.GetData sPara, vbString '检取当前的数据块
FlagSave = True
iPos = 1
FileLen = '获得文件长度
Else
Winsock1.GetData WebData(), vbByte '检取当前的数据块
Put #fileNum, iPos, WebData()
iPos = iPos + bytesTotal
If iPos = FileLen + 1 Then
Close #fileNum
End If
End If
End Sub
Winsock1.RemoteHost="wsdlyf.myetang.com"
另外在DataArrival事件中
取得的数据并不全是所要文件的,因为里面实际上有一个文件头。这个文件头以vbCrLf & vbCrLf结束。所以应该从这个标志之后的数据才写入目标文件。可以用Instr(strConv(byt,vbUnicode),vbCrLf & vbCrLf)取得这个位置.
建意先保存在一个Stream对象中,下载完成后再写入文件。下载完成会触发Close事件。