热情软件屋

 

利用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文件"

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio