好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Delphi使用TIdFtp控件实现FTP协议.doc

6页
  • 卖家[上传人]:pu****.1
  • 文档编号:535046823
  • 上传时间:2022-08-29
  • 文档格式:DOC
  • 文档大小:38.50KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Delphi使用TIdFtp控件实现FTP协议现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传就拿我写的电影服务器管理端程序来说,各种方案比较后,发现使用FTP可以完美地实现要求但是要通过WinSocket库实现FTP比较麻烦,幸好有Indy--一个包装了大多数网络协议的组件包通过Indy,程序设计人员可以通过阻塞方式进行编程,可以抛开蹩脚的Winsocket异步模式,采用与Unix系统上等同的阻塞编程模式进行这样,程序员就可以很好的处理程序的运行流程下面,我们进入到Indy的TIdFtp世界1. 控件的说明使用Indy9中的TIdFtp控件可以实现通过FTP方式进行文件的上传与下载2. 控件的具体使用(1)控件属性设置默认属性即可,与服务器连接直接相关的属性如主机名与用户等在建立连接时进行设定需要设定的是RecvBufferSize和SendBufferSize两属性的值另外需要根据要传输的文件类型指定TransferType属性,而其他属性按默认值设定即可。

      RecvBufferSize说明(默认值为8192字节):该属性为整型变量,用于指定连接所用的接受缓冲区大小SendBufferSize说明(默认值为32768字节):该属性也为整型变量,用于指定连接所用的发送缓冲区的最大值该属性在WriteStream方法中时,可用于TStream指定要发送内容的块数如果要发送的内容大于本属性值,则发送内容被分为多个块发送TransferType说明(默认值为ftBinary):该属性为TIdFTPTransferType型变量用于指定传输内容是二进制文件(ftBinary)还是ASCII文件(ftASCII)应用程序需要使用二进制方式传输可执行文件、压缩文件和多媒体文件等;而使用ASCII方式传输文本或超文本等文本型数据2)控件的事件响应OnDisconnected响应:TNotifyEvent类,用于响应断开(disconnect)事件当Disconnect方法被调用用来关闭Socket的时候,触发该响应应用程序必须指定该事件响应的过程,以便对该断开事件进行相应OnStatus响应:TIdStatusEvent类该响应在当前连接的状态变化时被触发。

      该事件可由DoStatus方法触发并提供给事件控制器属性axStatus是当前连接的TIdStatus值;aaArgs是一个可选的参数用于格式化函数,它将用于构造表现当前连接状态的文本消息OnWork响应:OnWord是TWorkEvent类事件的响应控制器OnWork用于关联DoWork方法当缓冲区读写操作被调用时通知Indy组件和类它一般被用于控制进度条和视窗元素的更新AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据AWorkCount指示当前操作的字节计数OnWorkBegin响应:TWorkBeginEvent类当缓冲区读写操作初始化时,该事件关联BeginWork方法用于通知Indy组件和类它一般被用于控制进度条和视窗元素的更新AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据AWorkCountMax用于指示发送到OnWorkBegin事件的操作的最大字节数,0值代表未知OnWorkEnd响应:TWorkEndEvent类当缓冲区读写操作终止时,该事件关联EndWork方法用于通知Indy组件和类。

      AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据AWorkCount表示操作的字节数在事件响应中,主要通过上述五种事件响应来控制程序在一般情况下,在OnDisconnected中设定连接断开的界面通知;在OnStatus中设定当前操作的状态;在OnWork中实现传输中状态条和其他参数的显示;而在OnWorkBegin和OnWorkEnd中分别设定开始传输和传输结束时的界面3) 连接远程服务器完成了设定控件属性和实现了控件的事件响应后,就可以与服务器进行交互和传输了在连接之前,应首先判断IdFtp是否处于连接状态,如果Connected为False,则通过界面控件或其他方式指定与服务器连接相关的一些TCP类属性的设置,分别是:Host(主机名):String、Username(用户名):String、Password(密码):String,也可以指定Port(端口)之后调用Connect方法连接远程服务器,如果无异常出现则连接成功建立过程说明:procedureConnect(AAutoLogin:boolean;constATimeout:Integer);该过程连接远程FTP服务器属性:AAutoLogin:boolean=True连接后自动登录,该参数默认为True。

      constATimeout:Integer=IdTimeoutDefault超时时间,单位:秒示例代码:ifIdFTP1.ConnectedthentryifTransferrignDatathenIdFTP1.Abort;IdFTP1.Quit;finallyendelsewithIdFTP1dotryUsername:=UserIDEdit.Text;Password:=PasswordEdit.Text;Host:=FtpServerEdit.Text;Connect;ChangeDir(CurrentDirEdit.Text);finallyend;(4) 改变目录连接建立后,可以改变当前FTP会话所在的目录对于已知绝对路径的情况下,可以直接调用ChangeDir(constADirName:string)方法来转换目录,ADirName表示服务器上的文件系统目录,另外还可以调用ChangeDirUp回到上级目录如果未知路径,则可以通过List(ADest:TStrings;constASpecifier:string;constADetails:boolean)过程获取远程服务器的当前目录结构,此时必须设定TransferType为ftASCIKASCII模式),其中:ADest保存当前目录结构,可以在后续程序中调用该列表。

      另外可以通过RetrieveCurrentDir方法获取当前目录名过程说明:procedureChangeDir(constADirName:string);改变工作目录属性constADirName:string远程服务器的目录描述说明:该过程实际上是实现了FTPCWD命令procedureChangeDirUp;到上一级目录functionRetrieveCurrentDir:string;该函数返回当前目录名procedureList(ADest:TStrings;constASpecifier:string;constADetails:boolean);列出当前目录所有文件和子目录及其属性参数:ADest:TStrings保存文件及子目录的返回结果constASpecifier:string=''文件掩码,用于列出符合条件的文件constADetails:boolean=true包含文件和子目录属性propertyDirectoryListing:TIdFTPListItems;返回文件及目录结构的列表示例代码:LS:=TStringList.Create;tryIdFTP1.ChangeDir(DirName);IdFTP1.TransferType:=ftASCII;CurrentDirEdit.Text:=IdFTP1.RetrieveCurrentDir;DirectoryListBox.Items.Clear;IdFTP1.List(LS);DirectoryListBox.Items.Assign(LS);ifDirectoryListBox.Items.Count>0thenifAnsiPos('total',DirectoryListBox.Items[0])>0thenDirectoryListBox.Items.Delete(0);finallyLS.Free;end;(5) 实现下载在下载之前,必须查看DirectoryListing.Items[sCurrFile].ItemType是否为文件,如返回为ditDirectory则代表当前文件名为目录,不能下载,必须导向到文件才可。

      如为文件,则可以进行下载在下载前,设定传输的类型为二进制文件,并且指定本地要保存的路径通过调用Get方法,实现文件的下载下载过程较慢,可以考虑将其放到线程中实现过程说明:procedureGet(constASourceFile:string;ADest:TStream;AResume:Boolean);overload;procedureGet(constASourceFile:string;constADestFile:string;constACanOverwrite:boolean;AResume:Boolean);overload;从远程服务器上获取文件属性说明:constASourceFile:string远程服务器上的源文件名constADestFile:string保存到客户机上的文件名constACanOverwrite:boolean=false重写同名文件AResume:Boolean=false是否进行断点续传示例代码:SaveDialog1.FileName:=Name;ifSaveDialog1.ExecutethenbeginSetFunctionButtons(false);IdFTP1.TransferType:=ftBinary;BytesToTransfer:=IdFTP1.Size(Name);ifFileExists(Name)thenbegincaseMessageDlg('Fileareadyexists.Doyouwanttoresumethedownloadoperation?',mtConfirmation,mbYesNoCancel,0)ofmrYes:beginBytesToTransfer:=BytesToTransfer-FileSizeByName(Name);IdFTP1.Get(Name,SaveDialog1.FileName,false,true);end;mrNo:beginIdFTP1.Get(Name,SaveDialog1.FileName,true);end;mrCancel:beginexit;end;end;endelsebeginIdFTP1.Get(Name,SaveDialog1.FileName,false);end;(6) 上传的实现上传的实现与下载类似,通过put方法即可。

      过程说明:procedurePut(constASource:TStream;constADestFile:string;constAAppend:boolean);overload;procedurePut(constASourceFile:string;cons。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.