读书人

关于idftp上传的的有关问题

发布时间: 2012-02-17 17:50:42 作者: rapoo

关于idftp上传的的问题?
//---连ftp
try
IdFTP1.Host:=is_ftp_ip;
IdFTP1.Username:=is_ftp_user;
IdFTP1.Password:=is_ftp_pass;
IdFTP1.Connect;
except
end;
try
IdFTP1.put(ls_filename,CurrFileList.Strings[i]);
DeleteFile(ls_filename);
except
end;

Idftp1.Disconnect;

上面的语法有时候会死掉,不知道是那里出问题,如果网页打开很慢,但网络是通的,这时候会不会idftp连接比较慢,或者上传比较慢,没相应

帮忙看看优化下

[解决办法]
(1)控件属性设置
RecvBufferSize说明(默认值为8192字节):该属性为整型变量,用于指定连接所用的接受缓冲区大小。
这些属性是indyftp里面的。

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中分别设定开始传输和传输结束时的界面。

好,下面是用到的 IdLogEvent的介绍。

事件:onReceived 就是已经接受到数据后应该做的事,而onReceive就是在接受过程中想做的事。

同理,onSent和onSend也是一样的道理。一般用onReceived和onSent.

好,下面是FTP客户端的实现了。其实FTP实现起来很简单,只要放IdFTP到界面上,然后进行连接后,就可以进行上传和下载了。当然,服务器要支持上传才行。

1在form的create写 IdFTPClient.Intercept :=IdLogEvent1;用于捕获Indy发送和接收的数据,在onreceived和onsent里面写如下代码:

procedure TFtpForm.IdLogEvent1Received
(ASender: TComponent; const AText,AData: String);
begin
ConnInfo( ' < <- ',AData);
end;
procedure TFtpForm.IdLogEvent1Sent(ASender: TComponent; const AText,AData: String);
begin
ConnInfo( '-> > ',AData);
end;
接收和发送数据时会把信息加到listbox里面。
ConnInfo是连接的信息,实现如下:
procedure TFtpForm.ConnInfo(Operation, S1: String);
Var
S: String;
begin
while Length(S1) > 0 do begin
if Pos(#13, S1) > 0 then begin
S := Copy(S1, 1, Pos(#13, S1) - 1);
Delete(S1, 1, Pos(#13, S1));
if S1[1] = #10 then Delete(S1, 1, 1);
end
else
S := S1;
ListBoxInfo.ItemIndex := ListBoxInfo.Items.Add(Operation + S);
end;
end;

然后写上程序的异常处理,我用的是ApplicationEvent组件
在ApplicationEvent的onexception里面写入WriteLog(E);把出现的异常记录在日志中。writelog的实现如下:

procedure TFTPForm.WriteLog(E:Exception);
const
FileNameExt = '.log ';
Path = 'log/ ' ;
var
F:TextFile;
DateStr,FileName,Buf:string;
begin
DateTimeToString(DateStr, 'yyyy-mm-dd ',Now());
FileName := Path+DateStr + FileNameExt;
AssignFile(F,FileName);
if FileExists(FileName) then
Append(F)
else
Rewrite(F);
try
DateTimeToString(Buf, 'yyyy-mm-dd hh:nn:ss: ',Now());


Buf := Buf+E.Message;
Writeln(F,Buf);
Application.ShowException(E);
finally
CloseFile(F);
end;
end;

把产生的异常按日期生成文件。如果文件存在,则把异常写入,如果不存在,则创建文件。
好,外围的工作已经做好了,到了idftp的工作了。

连接FTP服务器端FTP客户端名为IdFTPClient设定FTP的服务器地址和端口,用户名和密码后就可以连接了。如果成功了,在listbox里面显示连接成功。
IdFTPClient.Host := Trim(EdtHost.Text);
IdFTPClient.Port := StrToInt(Trim(EdtPort.Text));
IdFTPClient.Username := Trim(EdtName.Text);
IdFTPClient.Password := Trim(EdtPwd.Text);
ListBoxInfo.Items.Add( '连接到: '+EdtHost.Text);
IdFTPClient.Connect();
ListBoxInfo.Items.Add( '登陆成功 ');
在IdFTP的OnStatus里面写 ListBoxInfo.ItemIndex := ListBoxInfo.Items.Add(aStatusText);显示连接的状态,并且此时会触发IdLogEvent的onReceived和onSent事件。


读书人网 >.NET

热点推荐