旧版入口  全能虚拟主机 超低价格  泡泡游戏外挂
社区坛论
  • 精品模板 | 小品欣赏 | 相声欣赏 | MTV欣赏 | 小品相声 | 相声小品 | 视频访谈 | 游戏东西
  • 游客:  注册 | 登录 | 会员 | 搜索 | 统计 | 帮助


  •  
    标题: 在VB中实现文件上传
    neacn
    管理员
    Rank: 9Rank: 9Rank: 9


    杰出贡献奖  
    UID 1
    精华 0
    积分 224
    帖子 227
    威望 224
    现钱 10056 点
    存款 10000 点
    阅读权限 200
    注册 2006-12-16
    状态 离线
    发表于 2006-12-9 12:03 PM  资料  短消息  加为好友 
    在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






    ⌒╮⌒╮ ╭⌒╮⌒╮.╭⌒╮⌒╮
    ╱◥██◣ 欢迎光临 ╭⌒╮⌒╮
    │田︱田 田|   『冰城论坛』
    ╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
    HTTP://www.NeaCN.Com
    顶部
    ln.3721
    版主
    Rank: 7Rank: 7Rank: 7



    UID 212
    精华 0
    积分 39
    帖子 147
    威望 39
    现钱 576 点
    存款 500 点
    阅读权限 100
    注册 2006-11-27
    状态 离线
    发表于 2007-3-15 10:12 PM  资料  短消息  加为好友 

    顶部
     

     
  • 设为首页 - 加入收藏 - 联系站长 - 友情链接 - 版权申明 - 管理登录
  • Copyright © 2004 - 2008WWW.i198.NET all Rights Reserved 本网站alexa排名
    点击这里给我发消息或留言335934004   Email:web@i198.net  黑ICP备06001260号
    冰城在线 版权所有