在VB中实现文件上传

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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请求结束且数据已经接收到
下面是一个例子。

Priv ate Sub Inet1_StateC hanged(ByVal State A s Integer)
' Retriev e ser v er response using the GetC hunk
' method w hen State = 12. This example assumes the ' data is text.
Select C ase State
' ... O ther cases not show n.
C ase icResponseReceiv ed ' 12
Dim v tData A s Variant ' Data variable.
Dim strData A s String: strData = ""
Dim bDone A s Boolean: bDone = F alse
' Get f irst chunk.
v tData = Inet1.GetC hunk(1024, icString)
Do While Not bDone
strData = Data & vtData
' Get next chunk.
v tData = Inet1.GetC hunk(1024, icString)
If Len(v tData) = 0 Then
bDone = True
End If
Loop
txtData.Text = strData
End Select
End Sub
传送文件,用Inet 控件
Components -> Microsoft Internet Transfer Control 6.0
P r ivate Sub FTPTxtFile()
Dim TRA NSFER_STRING As String, PutString As String
Dim lSizeOfFile As Integer
Dim sLocalDir As String
Dim ftp As String
'
sLocalDir = GetSetting(gsTitle, "Settings", "LocalDir", "c:\")
If Right$(sLocalDir, 1) <> "\" Then sLocalDir = sLocalDir & "\"
'Set up FTP Connection
Inet1.URL = "ftp://" & s E diAddr
erName = s EdiUser
Inet1.Passw ord = sEdiPass
ftp = s E diP ath & sFTPFilename
Call check_EDI_execute
Inet1.Execute , "dir *.txt"
Call check_EDI_execute
'Transfer file
TRA NSFER_STRING = "PUT " & s TxtFile & " " & ftp
'Inet1.E xecute , TRA NSFER_STRING
'Call check_EDI_execute
Inet1.Execute , "CLOSE"
Call check_EDI_execute
End Sub
P r ivate Sub check_EDI_execute()
On Error GoTo FTPError1
While Inet1.StillE x ecuting
DoEvents
Wend
E x it Sub
FTPError1:
MsgBox "FTP E rror. Error - " & Str(E rr) & ", " & E rror, vbE xclamation, gs Title
End Sub
关于internet transfer control 控件的用法,
自从Inter net盛行以来,人们对于文件下载、即时信息获取、电子邮件传送变得方便许多。

Internet可以说是21世纪人类科技的一大创新。

由于这个重大改变,人们的生活方式也受到非常大的影响;电子购物、网上信息库、网上股市实时交易如雨后春笋般的出现。

以往,Visual Basic 4.0并没有提供一个完整的solution供Visual Basic 的爱好者设计Internet程序。

还好,VisualBasic 5.0 提供了一些控件,供我们设计Internet的相关程序。

在本文中,笔者将会用Internet Transfer control配合Web Brow ser control ,来告诉读者如何用Visual Bas ic 5.0轻松地设计Brow ser及FTP程序。

Control简介
Internet Transfer control
Internet Transfer control 是微软为方便使用者设计Inter net应用程序所提供的一种control。

它提供两种Internet protocol:HTTP及FTP。

我们在使用时,必须先设置好它的存取方式。

存取方式分为直接连接到Inter net 网络,或通过pr oxy来连接Internet网络两种,完全依我们的网络性质来定。

当我们设置好了相关参数之后,Inter net
Transfer control提供两个method:OpenURL及E xecute 来让我们执行网络相关操作,我们可以用这两个命令来执行一些Inter net command。

在下面的设计中,笔者会说明它的用法。

Web Brow ser control
Web Brow ser control最早是由IE 3.0所提供,在安装IE 3.0时就会自动载入;V isual Bas ic 5.0 将它变成内部控件。

它提供Navigate method,使我们能够连接到我们想要去的WWW Server。

各位读者一定很奇怪:既然Internet Transfer control能够通过HTTP及TP protocol连接到Internet,我们还要Web Brow ser control干甚么?只因为Internet Transfer control并没有提供图形模式的存取方式,所得到的文件仅能以文本模式传回。

如果传回的文件包含图形的话,还必须将所得到的HTML文件用程序来做一个转换。

所以笔者选择了Web Brow ser control来帮我们做一个转换。

以下就让笔者来告诉读者如何设计Web Brow ser及FTP client。

Web Brow ser程序设计
Step 1:设置好网络参数
首先要知道我们的网络系统是直接连到Internet,还是通过proxy连接到Internet。

我们可以通过以下的步骤来确定我们的系统是以哪种方式连接Internet:
在"我的电脑"选项double click进入"控制面板"。

在"控制面板"选项中double click 进入"Internet" 选项。

在Internet Dialog Box中选择connection。

由屏幕显示的DialogBox就可以知道系统是通过proxy还是通过dialing 的方式连接到Internet。

由于笔者的系统是通过proxy连接到Internet,我们必须要找出proxy Server的address 及port,以利于程序设置。

接着click"setting"选项来查看它的addr ess及port。

屏幕接着会显示一个Dialog Box,里面记着"address of proxy to use ": 172.18.16.65,"port" : 8080。

将它记录下来,等会儿就会用到这些参数。

Step 2:开始设计程序
在File选项中选择New P roject建立一个新的工程,在屏幕上会看到许多选项,如ActiveX Document.EXE、ActiveX Document.DLL、ActiveX.EXE、ActiveX Control等,这时要选Standard.EXE。

接着在P roject下,选择P roperty属性选项,在general选项下将P r oject Name改为Web brow ser。

在屏幕的For m上加入一个Web br owser control,取名为w eb1;接着加入一个Internet Transfer control,取名为Inet1。

加入三个TextBox control,分别取名为CGISearch、w ebname和htmlshow,并在CGISearch TextBox前加入一个Label,将其Caption改为Search。

加入三个Button control,分别取名为Search、Go和Show Doc。

将Caption分别改为Se
arch、Go to和show document 。

为方便读者了解关系,以下以表格解释一遍:
(TextBox)
Name
-------------------------------------------------
CGISearch(输入CGI命令)
webname(输入要前往的w eb address)
htmlshow(显示html文字结果)
(Button)
Name Caption
------------------------------------------------------------
Search(执行CGI命令) search
Go(执行前往w eb address的动作) Go to
Show Doc(显示html文字结果) show document
接着将Inet1的各项属性设置如下:
Accesstype=2-icnamedproxy
protocol=4-icHTTP
proxy=172.18.16.65:8080
在Go_Clic k()中加入以下程序代码,这个动作是连接到所想要去的w eb Server,并将屏幕显示在w eb1的方块区域内:
P r ivate Sub Go_Clic k()
web1.Navigate w ebname.Text
End Sub
以上程序是运用w eb1的Navigate,这个method将屏幕连接到w eb name TextBox中所指定的网络站点。

在htmlshow _Click()加入以下的程序代码:
P r ivate Sub htmlshow _Clic k()
a$ = w eb1.LocationURL
Show Doc.Text = Inet1.OpenURL(a$)
End Sub
以上程序,是先将w eb1所连接到的URL address,通过LocationURL这个property读出,并将它暂存于字符串a。

接着使用OpenURL()命令来将所接收到的HTML程序代码,显示在Show Doc这个TextBox中。

在CGIserch _Click()中加入以下程序代码:
P r ivate Sub CGIserch _Clic k()
Web1.Navigate "/bin/Search ? p=" + CGI.
Text
End Sub
这个动作是用CGI命令来查询文件。

在这里我们将查询命令指定传送到Yahoo 这个网络搜寻站。

这样我们就完成了一个小型的Web Brow ser。

Step 3:测试程序
执行刚设计完的Web Brow ser,并在w eb name这个TextBox中填入所要去的网址。

这里我们将它设置为。

接着按下Go Button,将会看到在w eb1 control的方块区域内显示了Microsoft的HomePage。

按下Show Doc Button,将可以在htmlshow这个TextBox中看到Microsoft HomePage的HTML 程序代码。

接下来让我们试试CGI搜寻功能。

在CGIserch TextBox中加入communication,结果我们发觉查询的结果显示在w eb1方形区域中。

同样的,我们也可以按下Show Doc Button,将可以在htmlshow这个TextBox中,看到查询结果所传回的HTML 程序代码。

恭喜您成功了!
FTP程序设计
前面提到Inter net Transfer control可以提供FTP pr otocol,这里我们便要告诉您如何运用Internet Transfer control来设计一个可以连接FTP Server的client程序,并将FTP Server上的bbb.txt文件dow nload到local 端。

Step 1:程序设计
在File选项中选择New P roject建立一个新的工程,在屏幕上看到许多选项,如ActiveX Document.EXE、ActiveX Document.DLL、ActiveX.EXE、ActiveX Control等,这时要选Standar d.EXE。

接着在P roject下,选择P r operty 属性选项,在general选项下将P rojectName改为FTP client。

在屏幕的For m上加入一个Internet Transfer control,取名为Inet1。

将Inet1 property的参数设置如下:
Accesstype=2-icnamedproxy
Username="david"
passw ord="2333334"
protocol=2-icFTP
proxy=172.18.16.65:8080
我们在此将Username及passw ord设置好,当我们Login进入FTP Server时,Server将会直接跳过输入Username和passw ord的屏幕。

加入一个TextBox control,取名为FTPgetfile。

加入两个Button control,取名为FTPget和FTP Link,分别将其Caption改为FTPget和FTPLink。

在FTPLink _Clic k()中加入以下程序代码:
P r ivate Sub FTP Link _Click()
Inet1.excute "FTP 128.9.200.4"
End Sub
E xecute是Internet Transfer control提供的一个用来执行FTP公用程序的method,我们可以在它的后面加入FTP的命令,这样我们就可以使用任何熟悉的FTP公用程序来完成工作。

笔者的FTP Server地址是
128.9.200.4,所以我们在FTP命令后面填入这个地址。

接着在FTPget _Click()中加入以下程序代码:
P r ivate Sub FTP Link _Click()
Inet1.excute "GET aaa.txt c:\bbb.txt"
End Sub
这个动作是将FTP Server上的aaa.txt文件传送到client端。

Step 2:测试
将FTPclient执行起来,按下FTPLink Button,连结到 FTP Server。

按下FTPget But ton,取回文件。

有没有发觉到在C:\目录下面多了一个bbb.txt的文件?
恭喜您成功了!。

相关文档
最新文档