怎样用FTP方式实现数据的上传下载

pbmis 2002-08-28 01:10:31
在以前的帖子上看到如下文字:

使用Internet Transfer控件
---- Internet Transfer控件是网络编程中非常常用的控件。它支持目前Internet上使用最为广泛的两种协议,即Http和Ftp。在windows98中它是由系统自带。有关此控件的详细资料请查看相关书籍。这里我们只使用它的Ftp功能。在PB中加入一个与此控件的OLE,取名ole_1,并按以下数据设置此控件的属性(注意不是ole_1的属性),表中没有列出的属性请用缺省值:

属性 值 说明
Protocol 2 指定用Ftp协议
Remotehost 202.114.67.2
Username User1
Password 12345

---- Internet Transfer控件支持两种数据传输方式,即同步传输方式和异步传输方式。同步传输方式在数据传输时会阻塞程序,此功能是通过调用该控件的OpenUrl方法来实现的;而异步方式则不会阻塞程序,它通过调用控件的Execute方法来实现。同步方式虽然易于控制,但它只能下载文件,不能上传文件,这使得它在实际的应用受到限制。要实现数据的上传下载,只能使用此控件的异步传输方式。要完成上例中的功能,在PB程序中加入以下语句即可:

Ole_1.object.execute("","put c:
\temp\t00001.txt \txtdata\t00001.txt")

---- 同理,如果要将服务器上的文件下载到本地,在程序中加入即下语句:

Ole_1. object.execute("","get \txtdata\t00001.txt c:\temp\t00001.txt")

---- Internet Transfer控件的功能很强大,利用它足以制作一个功能比较完善的FTP工具,而且它是操作系统自带的,在编程时不需要注册新的控件。但根据笔者的使用经验,此控件也有两个不能忽视的缺点,其一、它的数据上传下载是异步传输的,在每次只运行一个ftp命令时尚可,如果一次运行多个ftp命令就会出错。比如说,我们想先进入服务器的\file目录,再上传数据,这样程序应如下:

Ole_1.object.execute("","cd \file\")
Ole_1.object.execute("","put
c:\temp\t00001.txt \txtdata\t00001.txt")
---- 由于execute方法是异步执行的,它不等第一个语句完成就开始执行第二条语句,这样可能服务器还来不及将当前目录转到\file下数据已经开始上传,造成错误。

---- 其二、笔者还发现一个莫名其妙的问题,那就是利用此控件进行上传时它会将上传到服务器上的文件的文件名改为大写,如上例中,本地的t00001.txt上传到服务器上后,它的名字会变成T00001.TXT,这在NT上自然无妨,但在Unix机器上就可能带来错误。


问题:
1.我的系统是WIN98,可是PB中看不到此Internet Transfer控件,怎么加进来?
2.应用程序中怎么通过代码来改上面提到的控件属性:Protocol、Remotehost、Username、Password?
...全文
343 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pbmis 2002-08-30
  • 打赏
  • 举报
回复
snowdesert():能不能公布一下?

我按上面的第三种方法到www.mabry.com上去下载了控件(ftpx.ocx),但需要注册,试了一下,在connected事件写上代码:
if fconnected then
sle_1.text = "连接成功!"
is_con = true
else
sle_1.text = "连接失败!"
is_con = false
end if

但保存时报错,说fconnected未定义,怎么办?
yhqchina 2002-08-30
  • 打赏
  • 举报
回复
TO:snowdesert()

既然到处都有免费的ftp控件,为何不在这里公布呢?
snowdesert 2002-08-30
  • 打赏
  • 举报
回复
最合理的方法是采用标准ftp控件,网上到处都有免费的,
这样能实现的功能和安全性都可得到保障
wh_cisco 2002-08-30
  • 打赏
  • 举报
回复
run()是可以的,我写过用这样的程序,就是ftp+参数文件的方式,dos窗口也可以不出现,但是传输了多少,进度如何判断,文件大小,传输时间,我都无法判断!不知用ole控件能不能判断进度,文件大小,传输时间?
xiaobzg 2002-08-30
  • 打赏
  • 举报
回复
run确实有那种问题,那个控件好像是VB写的,到网上查一下,我也不太清楚也很想知道,那位大侠用过,给各例子可以吗?hish@elong.com
pbmis 2002-08-29
  • 打赏
  • 举报
回复
run()太差了,出现DOS命令框倒好解决,但数据传输成功与否无法判断就无法容忍,所以不能用

我现在要用第二种方式,再问一下:Internet Transfer控件对应的OCX文件是哪一个?
xiaobzg 2002-08-29
  • 打赏
  • 举报
回复
run()可以的,判断是否连通也可以判断出来,只不过是出现DOS命令框
pbmis 2002-08-28
  • 打赏
  • 举报
回复
Internet Transfer控件对应的OCX文件是哪一个呢?
pbsql 2002-08-28
  • 打赏
  • 举报
回复
RUN()肯定不行,第2、3种方法可以试试
ice2water 2002-08-28
  • 打赏
  • 举报
回复
我这里有一遍文章可供参考:

在PB中实现ftp传输
武汉大学 丁波涛
在用PB进行开发时常常需要用到ftp功能,最典型的应用就是将数据窗口中的数据生成txt文件,然后将此数据文件用ftp发送到远程服务器上去。由于pb本身并未提供任何ftp的功能,因此想在pb中进行ftp传输,只能应用pb以外的资源。以下是笔者在pb开发中总结出来的几种方法。
1. 使用外部命令
这种方法就是在pb程序中运行Windows中自带的ftp命令。具体做法是在程序中生成一个.bat文件,将要运行的ftp命令写到此文件中,再运行这个批处理文件。假设ftp服务器ip为 202.114.67.2,用户名为user,口令12345,现在要将本地c:\temp\下的t00001.txt文件上传到服务器的\txtdata\目录下去。则pb代码如下:

integer li_bat //文件名指针
li_bat = FileOpen(path_ftp+'get_file.bat',
lineMode!, Write!, LockWrite!, Replace!)

FileWrite(li_bat, 'cd c:\temp\')
FileWrite(li_bat, 'ftp 202.114.67.2')
FileWrite(li_bat, 'user)
FileWrite(li_bat, '12345')
FileWrite(li_bat, 'put t00001.txt \txtdata\t00001.txt')
FileWrite(li_bat, 'bye')
FileWrite(li_bat, 'exit')
FileClose(li_bat)
Run(path_ftp+'get_file.BAT',Minimized!)
messagebox("提示信息","数据上报完毕")

此方法的优点是简单易行,既不要调用API函数,也不需加入OLE。缺点一是要运行外部命令,将会打开dos窗口,显得不够和谐;二是数据传输成功与否无法判断,在编程时不好控制。
2. 使用Internet Transfer控件
Internet Transfer控件是网络编程中非常常用的控件。它支持目前Internet上使用最为广泛的两种协议,即Http和Ftp。在windows98中它是由系统自带。有关此控件的详细资料请查看相关书籍。这里我们只使用它的Ftp功能。在PB中加入一个与此控件的OLE,取名ole_1,并按以下数据设置此控件的属性(注意不是ole_1的属性),表中没有列出的属性请用缺省值:

属性 值 说明
Protocol 2 指定用Ftp协议
Remotehost 202.114.67.2
Username User1
Password 12345

Internet Transfer控件支持两种数据传输方式,即同步传输方式和异步传输方式。同步传输方式在数据传输时会阻塞程序,此功能是通过调用该控件的OpenUrl方法来实现的;而异步方式则不会阻塞程序,它通过调用控件的Execute方法来实现。同步方式虽然易于控制,但它只能下载文件,不能上传文件,这使得它在实际的应用受到限制。要实现数据的上传下载,只能使用此控件的异步传输方式。要完成上例中的功能,在PB程序中加入以下语句即可:
Ole_1.object.execute("","put c:\temp\t00001.txt \txtdata\t00001.txt")

同理,如果要将服务器上的文件下载到本地,在程序中加入即下语句:
Ole_1. object.execute("","get \txtdata\t00001.txt c:\temp\t00001.txt")

Internet Transfer控件的功能很强大,利用它足以制作一个功能比较完善的FTP工具,而且它是操作系统自带的,在编程时不需要注册新的控件。但根据笔者的使用经验,此控件也有两个不能忽视的缺点,其一、它的数据上传下载是异步传输的,在每次只运行一个ftp命令时尚可,如果一次运行多个ftp命令就会出错。比如说,我们想先进入服务器的\file目录,再上传数据,这样程序应如下:
Ole_1.object.execute("","cd \file\")
Ole_1.object.execute("","put c:\temp\t00001.txt \txtdata\t00001.txt")

由于execute方法是异步执行的,它不等第一个语句完成就开始执行第二条语句,这样可能服务器还来不及将当前目录转到\file下数据已经开始上传,造成错误。
其二、笔者还发现一个莫名其妙的问题,那就是利用此控件进行上传时它会将上传到服务器上的文件的文件名改为大写,如上例中,本地的t00001.txt上传到服务器上后,它的名字会变成T00001.TXT,这在NT上自然无妨,但在Unix机器上就可能带来错误。

3. 使用Mabry Internet FTP/X Control
此控件是由Mabry Software公司提供的一个用于Ftp的控件,读者可以到www.mabry.com上去下载此控件(mftpx.ocx)。经比较,笔者认为在进行ftp传输方面,使用此控件进行编程最方便。它能完成绝大部分Ftp的功能,而且在编程中能很方便地控制程序的运行。比如说要完成前述功能,我们先注册该控件,然后在PB程序中加入一个该控件的Ole,取名Ole_1;一个单行编辑器Sle_1,用为显示有关信息;一个按钮Cb_1,点击它时进行Ftp操作。另设一个boolean 型Instance Variables,取名is_con,并将它设为false,用于指示网络是否已连通。对该控件的属性进行如下设置:

属性 值 说明
Host 202.114.67.2
Logonname User
Logonpassword 12345
Timeout 10 根据实际情况设置

在Cb_1的clicked事件中加入以下代码:
sle_1.text = "正在连接....."
setpointer(hourglass!)
ole_1.object.connect()

if is_con then
sle_1.text = "开始传输...."
ole_1.object.putfile("c:\temp\t00001.txt","/txtdata/t00001.txt")
sle_1.text = "传输完毕!"
end if

setpointer(arrow!)
is_con = false
在Ole_1的各事件中加入相应代码:
connected事件:
if fconnected then
sle_1.text = "连接成功!"
is_con = true
else
sle_1.text = "连接失败!"
is_con = false
end if
externalexception事件:
sle_1.text = "外部错误,可能网络不通"

action = ExceptionIgnore!
progress事件:
sle_1.text = "已传输"+ string(bytestransfered)+"字节....."

此控件其它函数和属性请在PB的Browser画板中查看,此处不再详述。
上述程序在以下系统中试验通过:

服务器 Digital Unix

开发工具 Pwin98 + Powerbuilder6.5

balloonman2002 2002-08-28
  • 打赏
  • 举报
回复
可以直接通过RUN()函数调用FTP命令啊;
如果要用此控件又不熟悉用法时,可以在OLE选项时选中Internet Transfer控件,如果看不到,说明你尚未注册,可以通过点击“REGEISTER NEW”按钮来选中此控件对应的OCX文件,然后点击“BROWSE”按钮来查看其对应的属性、方法、函数、事件等,如还不明,可装MSDN查看其中的详细帮助;

1,079

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧