在VB中实现文件上传 下载本文

内容发布更新时间 : 2024/7/5 2:34:23星期一 下面是文章的全部内容请认真阅读。

☆在VB中实现文件上传☆

Visual Basic 作为一个集应用程序开发、测试、查错功能于一 体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据 库维护系统的过程中,选择了VB5.0作为开发平台,Unix作为服务器端 操作系统,Informix 作为服务器数据库。 问题的出现

在开发该维护系统的过程中,注意到Informix 数据库的字段 类型CLOB 填入数据时需要函数FILETOCLOB(\ , 其中的\需要指出文件路径和文件名称。然而,在维护过程 中此文件是在客户端执行的,这样就要求即时将文件传输到服务器端 。 解决办法

1. FTP传输工具

我们首先使用FTP传输工具,用VB5.0中SHELL 命令调用DOS批处理 文件来实现传输的需要。 Shell调用格式:

Shell(pathname[,windowstyle]) 例子:Shell(\indows\%upload.bat\) 批处理文件upload.bat 的内容: c:\\windows\\ftp hostname username password

send c:\\zrh\%upload.txt upload.txt bye

该命令实现了文件\的传输要求。在使用完毕之后, 再调用命令把该文件删除。 例子:Shell(\indows\\del_up.bat\ 批处理文件del_up.bat 的内容: c:\\windows\\ftp hostname username password dele upload.txt bye

这样,文件\被删除。

但是,另一个问题出现了。由于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 \ord@hostname\ _

\T\ &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 \ _ \ETE 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

传送文件,用 Inet 控件

Components -> Microsoft Internet Transfer Control 6.0

Private Sub FTPTxtFile()

Dim TRANSFER_STRING As String, PutString As String Dim lSizeOfFile As Integer Dim sLocalDir As String Dim ftp As String '

sLocalDir = GetSetting(gsTitle, \ If Right$(sLocalDir, 1) <> \

'Set up FTP Connection Inet1.URL = \EdiAddr Inet1.UserName = sEdiUser Inet1.Password = sEdiPass ftp = sEdiPath & sFTPFilename Call check_EDI_execute