用Winsock控件实现文件的下载
使用控件有:Winsock控件,CommandButton 控件,TextBox 控件
编程步骤如下:
1.首先声明变量
Dim strCommand As String
Dim strWebPage As String
2.把如下代码加到Command1的Command1_Click事件:
Private Sub Command1_Click()
Winsock1.RemoteHost = "202.103.176.81" '设置连接的网址
Winsock1.RemotePort = 80 '设置要连接的远程端口号
Winsock1.Connect '返回与远程计算机的连接。
End Sub
3.把如下代码加到Winsock1的Connect事件:
Private Sub Winsock1_Connect() '当一个 Connect 操作完成时发生
On Error Resume Next
strWebPage = "http://202.103.176.81/crun/yingzi007/index.html" '要下载的文件
strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf ''GET 为FTP命令 取得文件
strCommand = strCommand + "Accept: */*" + vbCrLf '这句可以不要
strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
strCommand = strCommand + vbCrLf '记住一定要加上vbCrLf
'Debug.Print strCommand '注:你可以用Debug.Print strCommand 来查看一下格式
Winsock1.SendData strCommand '给远程计算机发送数据 
End Sub
4.把如下代码加到Winsock1的DataAmival事件:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '取得数据时产生该事件
On Error Resume Next '在错误处理程序结束后,恢复原有的运行
Dim webData As String
Winsock1.GetData webData, vbString '检取当前的数据块
Text1.Text = Text1.Text + webData
End Sub

解决方案 »

  1.   

    在VB中实现文件上载
     张瑞华  Visual Basic 作为一个集应用程序开发、测试、查错功能于一 体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据 库维护系统的过程中,选择了VB5.0作为开发平台,Unix作为服务器端 操作系统,Informix 作为服务器数据库。 
      问题的出现 
      笔者在开发该维护系统的过程中,注意到Informix 数据库的字段 类型CLOB 填入数据时需要函数FILETOCLOB("FILENAME","SERVER") , 其中的"FILENAME"需要指出文件路径和文件名称。然而,在维护过程 中此文件是在客户端执行的,这样就要求即时将文件传输到服务器端 。 
      解决办法 
      1. FTP传输工具 
      我们首先使用FTP传输工具,用VB5.0中SHELL 命令调用DOS批处理 文件来实现传输的需要。 
      Shell调用格式: 
      Shell(pathname[,windowstyle]) 
      例子:Shell("c:\windows\upload.bat") 
      批处理文件upload.bat 的内容: 
      c:\windows\ftp hostname 
      username 
      password 
      send c:\zrh\upload.txt upload.txt 
      bye 
      该命令实现了文件"upload.txt"的传输要求。在使用完毕之后, 再调用命令把该文件删除。 
      例子:Shell("c:\windows\del_up.bat") 
      批处理文件del_up.bat 的内容: 
      c:\windows\ftp hostname 
      username 
      password 
      dele upload.txt 
      bye 
      这样,文件"upload.txt"被删除。 
      但是,另一个问题出现了。由于Shell 函数的运行机制是与其它 程序同步执行,也就是说,当调用Shell 函数的子程序还没有执行完毕 之前,Shell函数后面的语句已经执行。在大批量添加数据的过程中, 就会出现某个记录的文件还没有传到,而下一个插入语句(I nsert)已 经开始调用。这样,ODBC调用就会出现错误。 
      2. INET 控件 
      Internet Transfer控件提供了Internet 上最常使用的两种协议 :HTTP 和FTP。使用HTTP 协议可以连接到WWW服务器上来下载文件;使 用FTP协议则可以登录到FTP 服务器。一般的FTP命令,例如CD、GET 都可以通过Execute 方法实现。 
      下面是一个设置INET控件属性的例子。 
      inet1.URL=ftp://username:password@hostname/document 
      inet1.Protocol=2-icFTP 
      inet1.RemoteHost=hostname 
      inet1.RemotePort=21 
      inet1.Username=username 
      inet1. Password=password 
      执行文件传输: 
      Inet1.Execute "ftp://username:password@hostname", _ 
      "PUT" &local_filename & " UPLOAD1.TXT" 
      right1 = Inet1.StillExecuting 
      Do While right1 
        right1 = Inet1.StillExecuting 
        DoEvents 
      Loop 
      这样便实现了文件的上载。 
      *SINET 控件的优点 
      INET控件与Shell()函数的不同之处在于INET控件通过调用语句 
      right1 = Inet1.StillExecuting 
      Do While right1 
        right1 = Inet1.StillExecuting 
        DoEvents 
      Loop来控制语句执行的顺序。在文件传输工作未完成之前,程序 不会执行其它语句,自然也就不会出现调用Shell 函数所出现的问题 。变量right1用来测试inet1 的执行状态,如果进程中仍在进行文件 传输的工作,则调用过程DoEvents给系统空闲时间来做文件传输工作, 这样便成功地执行了文件上载的功能。该文件使用完毕之后将被删除 。 
      Inet1.Execute "ftp://informix:informix@rd", "DELETE UPLOAD1.TXT" 
      right1 = Inet1.StillExecuting
      Do While right1
        right1 = Inet1.StillExecuting 
        DoEvents 
      Loop 
      将上载的文件删除是为了避免占用服务器端磁盘空间。 
      *S利用StateChanged事件提示信息 
      服务器在执行inet1.execute 的同时也激活了Inet1_StateChang ed事件,进程可以根据捕获到的状态进行动作。 
      object_StateChanged(ByVal State As Integer)
      State:整数类型Integer  下面是状态的说明。  常数值   描述icNone
      0      未报告状态icHostResolvingHost
      1      控件正在寻找指定主机的IP地址icHostResolved
      2      控件已成功找到指定主机的IP地址icConnecting
      3      控件正在与指定主机进行连接icConnected
      4      控件已成功与指定主机连接icRequesting
      5      控件正在向主机发出请求icRequestSent
      6      控件已成功向主机发出请求icReceivingResponse
      7      控件正在从主机接收反馈信息icResponseReceived
      8      控件已成功从主机接受反馈信息icDisconnecting
      9      控件正在与主机断开icDisconnected
      10     控件已与主机断开icError
      11     在与主机通信的过程中发生了错误icResponseComp leted
      12     请求结束且数据已经接收到  下面是一个例子。  Private Sub Inet1_StateChanged(ByVal State As Integer) 
        ' Retrieve server response using the GetChunk 
        ' method when State = 12. This example assumes the 
        ' data is text. 
        Select Case State 
            ' ... Other cases not shown. 
            Case icResponseReceived ' 12 
              Dim vtData As Variant ' Data variable. 
              Dim strData As String: strData = "" 
              Dim bDone As Boolean: bDone = False 
              ' Get first chunk. 
              vtData = Inet1.GetChunk(1024, icString) 
              Do While Not bDone 
                  strData = Data & vtData 
                  ' Get next chunk. 
                  vtData = Inet1.GetChunk(1024, icString) 
                  If Len(vtData) = 0 Then 
                   bDone = True 
                  End If 
              Loop 
              txtData.Text = strData 
        End Select 
      End Sub