在VB中实现文件上传
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
☆在V B中实现文件上传☆
V isual Basic 作为一个集应用程序开发、测试、查错功能于一体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据库维护系统的过程中,选择了V B5.0作为开发平台,U nix作为服务器端操作系统,Informix 作为服务器数据库。
问题的出现
在开发该维护系统的过程中,注意到Informix 数据库的字段类型C L O B 填入数据时需要函数FILETOC L OB("FILENAME","SERVER") , 其中的"FILENAME"需要指出文件路径和文件名称。然而,在维护过程中此文件是在客户端执行的,这样就要求即时将文件传输到服务器端。
解决办法
1. F TP传输工具
我们首先使用F TP传输工具,用VB5.0中SHELL 命令调用DO S批处理文件来实现传输的需要。
Shell调用格式:
Shell(pathname[,w indow sty le])
例子:Shell("c:\w indow s\upload.bat")
批处理文件upload.bat 的内容:
c:\w indow s\ftp hostname
username
passw ord
send c:\zrh\upload.txt upload.txt
by e
该命令实现了文件"upload.txt"的传输要求。在使用完毕之后, 再调用命令把该文件删除。
例子:Shell("c:\w indow s\del_up.bat")
批处理文件del_up.bat 的内容:
c:\w indow s\ftp hostname
username
passw ord
dele upload.txt
by e
这样,文件"upload.txt"被删除。
但是,另一个问题出现了。由于Shell 函数的运行机制是与其它程序同步执行,也就是说,当调用Shell 函数的子程序还没有执行完毕之前,Shell函数后面的语句已经执行。在大批量添加数据的过程中, 就会出现某个记录的文件还没有传到,而下一个插入语句
(I nsert)已经开始调用。这样,O DBC调用就会出现错误。
2. INET 控件
Internet Transfer控件提供了Inte rnet 上最常使用的两种协议:HTTP 和F TP。使用HTTP 协议可以连接到WWW服务器上来下载文件;使用F TP协议则可以登录到F TP 服务器。一般的F TP命令,例如CD、GET 都可以通过Execute 方法实现。
下面是一个设置INET控件属性的例子。
inet1.U RL=ftp://username:passw ord@hostname/document
inet1.Protocol=2-icF TP
inet1.RemoteHost=hostname
inet1.RemotePort=21
inet1.U sername=username
inet1. Passw ord=passw ord
执行文件传输:
Inet1.Execute "ftp://username:passw ord@hostname", _
"PU T" &local_f ilename & " UPLOAD1.TXT"
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEv ents
Loop
这样便实现了文件的上载。
*SINET 控件的优点
INET控件与Shell()函数的不同之处在于INET控件通过调用语句
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEv ents
Loo p来控制语句执行的顺序。在文件传输工作未完成之前,程序不会执行其它语句,自然也就不会出现调用Shell 函数所出现的问题。变量right1用来测试inet1 的执行状态,如果进程中仍在进行文件传输的工作,则调用过程DoEv ents给系统空闲时间来做文件传输工作, 这样便成功地执行了文件上载的功能。该文件使用完毕之后将被删除。
Inet1.Execute "ftp://informix:informix@rd", _
"DEL ETE UPL OAD1.TXT"
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEvents
Loop
将上载的文件删除是为了避免占用服务器端磁盘空间。
*S利用StateC hanged事件提示信息
服务器在执行inet1.exe cute 的同时也激活了Inet1_StateC hang ed事件,进程可以根据捕获到的状态进行动作。
object_StateC hanged(ByVal State As Integer)
State:整数类型Integer
下面是状态的说明。
常数值描述icNone
0未报告状态icHostResolv ingHost
1控件正在寻找指定主机的IP地址icHostResolv ed
2控件已成功找到指定主机的IP地址icC onnecting
3控件正在与指定主机进行连接icC onnected
4控件已成功与指定主机连接icRequesting
5控件正在向主机发出请求icRequestSent
6控件已成功向主机发出请求icReceiv ingResponse
7控件正在从主机接收反馈信息icRespo nseReceiv ed
8控件已成功从主机接受反馈信息icDisconnecting
9控件正在与主机断开icDisconnected
10控件已与主机断开icError
11在与主机通信的过程中发生了错误icResponseC omp leted
12请求结束且数据已经接收到
下面是一个例子。