利用Winsock控件下载ZIP文件,为什么下载后的文件大小不一致
编号:QA003729
建立日期: 2001年1月2日 最后修改日期:2001年1月2日
所属类别:
陈文龙:
操作系统: Windows98
编程工具: VB6.0
问题: 请问利用Winsock控件下载ZIP文件,为什么下载后的文件大小不一致?
部分源码如下:
Private Sub wscHttp_Close(Index As Integer)
If Not m_bResponseReceived(Index) Then
m_strHttpResponse(Index) = Mid(m_strHttpResponse(Index), _
InStr(1, m_strHttpResponse(Index), _
vbCrLf & vbCrLf) + 4)
m_bResponseReceived(Index) = True
Open FileName(Index) For Binary Access Write Lock Read Write As #1
Put #1, , m_strHttpResponse(Index)
Close #1
AddItemInListBox Index, "下载完毕!"
wscHttp(Index).Tag = ""
End If
End Sub
Private Sub wscHttp_Connect(Index As Integer)
Dim strHttpRequest As String
strHttpRequest = "GET " & m_strFilePath(Index) & " HTTP/1.1" & vbCrLf
strHttpRequest = strHttpRequest & "Host: " & m_strRemoteHost(Index) & vbCrLf
strHttpRequest = strHttpRequest & "Accept: */*" & vbCrLf
strHttpRequest = strHttpRequest & "Connection: close" & vbCrLf
strHttpRequest = strHttpRequest & vbCrLf
wscHttp(Index).SendData strHttpRequest
End Sub
Private Sub wscHttp_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
Dim intBreakePosition As Integer
Dim vHeaders As Variant
Dim vHeader As Variant
On Error Resume Next
'
AddItemInListBox Index, "正在接收数据..."
wscHttp(Index).GetData strData, vbString
m_strHttpResponse(Index) = m_strHttpResponse(Index) & strData
m_lDownloadedBytes(Index) = m_lDownloadedBytes(Index) + bytesTotal
If Not m_bHeaderReceived(Index) Then
intBreakePosition = InStr(1, m_strHttpResponse(Index), vbCrLf & vbCrLf)
If intBreakePosition Then
m_bHeaderReceived(Index) = True
m_lDownloadedBytes(Index) = m_lDownloadedBytes(Index) - intBreakePosition - 3
vHeaders = Split(Left(m_strHttpResponse(Index), intBreakePosition - 1), vbCrLf)
For Each vHeader In vHeaders
If InStr(1, vHeader, "Content-Length") Then
m_lContentLength(Index) = CLng(Mid(vHeader, InStr(1, vHeader, " ") + 1))
lvItem(Index).SubItems(3) = CInt(m_lContentLength(Index) / 1024) & " KB"
Exit For
End If
Next
End If
Else
If m_lContentLength(Index) > 0 Then
lvItem(Index).SubItems(2) = CInt(m_lDownloadedBytes(Index) / (m_lContentLength(Index) / 100)) & "%"
lvItem(Index).SubItems(4) = CInt(m_lDownloadedBytes(Index) / 1024) & " KB"
Else
lvItem(Index).SubItems(4) = CInt(m_lDownloadedBytes(Index) / 1024) & " KB"
End If
End If
'
End Sub
回答:
问题出在DataArrival事件中,如果下载文本文件应该是可以的。但是ZIP文件是二进制文件,所以你不能把它保存在字符串中(原理已经在QA000051 "VB 5提示错误:"输入超出文件尾""中讲了)。你应该把strData定义为Variant变量,然后把GetData的vbString改为vbArray + vbByte。
相关问题:
QA001161 "如何自动下载HTTP文件"
此问题由李海回答。
| |
|
|
| |
|
|