做个ftp上传jpg文件的小程序,需要通过Socks5代理上传。
开发环境 Delphi7+Indy9.00.10(FIdftp)
测试时发现,不通过代理上传正常,选择代理后 连接、登录、更改文件夹都正常,就是在执行上传的时候长时间(大概1分种)没有响应,然后就提示 Socket Error # 10060 Connection timed out. 找了两天也没找到原因。请各位朋友帮忙分析一下。谢谢!
部分代码如下:
ftp连接代码
with FftpClient do
begin
Host :=FTPParam.Host;
Port :=FTPParam.Port;
Username:=FTPParam.UserName;
Password:=FTPParam.PassWord; Passive:=False;
//使用 Socks 5 代理
if FTPParam.PoxyUse then
begin
IOHandler:=IdIOHandlerSocket1;
IdIOHandlerSocket1.SocksInfo:=IdSocksInfo1;
IdSocksInfo1.Version:=svSocks5;
IdSocksInfo1.Host :=FTPParam.PoxyHost;
IdSocksInfo1.Port :=FTPParam.PoxyPort;
if Trim(FTPParam.PoxyUserName)='' then
IdSocksInfo1.Authentication:=saNoAuthentication
else
begin
IdSocksInfo1.Authentication:=saUsernamePassword;
IdSocksInfo1.Username:=FTPParam.PoxyUserName;
IdSocksInfo1.Password:=FTPParam.PoxyPassWord;
end;
end
else
FftpClient.IOHandler:=Nil;
try
LogMessage('Connect to FTP Server '+FTPParam.Host+':'+IntToStr(FTPParam.Port));
FftpClient.Connect(True);
except
LogMessage('Connect FTP Server Error.');
end; end;上传函数
function Tfrm_main.FtpUpLoad(AData:TpeccImage;FPicName:String):boolean;
var
fname:String;
iPostion:integer;
begin
Result:=True;
fname:=UpperCase(FPicName);
if pos('.JPG',fname)>0 then
Delete(fname,pos('.JPG',fname),4); fname:=fname+AData.sort+'.JPG'; try
iPostion:=FftpClient.Size(fname);
finally
if iPostion=-1 then
iPostion:=0;
end;
if AData.sort='#3' then
LogMessage('Begin UpLoad File '+FPicName+' part'+AData.sort)
else
LogMessage('Begin UpLoad File Part'+AData.sort);
AData.stream.Position:=iPostion;
try
FftpClient.Noop;
FftpClient.Put(AData.stream,fname);
FftpClient.Noop;
except
on e:Exception do
begin
Result:=False;
LogMessage(e.Message);
logMessage('filename:='+fname);
end;
end;
Application.ProcessMessages;
end;
开发环境 Delphi7+Indy9.00.10(FIdftp)
测试时发现,不通过代理上传正常,选择代理后 连接、登录、更改文件夹都正常,就是在执行上传的时候长时间(大概1分种)没有响应,然后就提示 Socket Error # 10060 Connection timed out. 找了两天也没找到原因。请各位朋友帮忙分析一下。谢谢!
部分代码如下:
ftp连接代码
with FftpClient do
begin
Host :=FTPParam.Host;
Port :=FTPParam.Port;
Username:=FTPParam.UserName;
Password:=FTPParam.PassWord; Passive:=False;
//使用 Socks 5 代理
if FTPParam.PoxyUse then
begin
IOHandler:=IdIOHandlerSocket1;
IdIOHandlerSocket1.SocksInfo:=IdSocksInfo1;
IdSocksInfo1.Version:=svSocks5;
IdSocksInfo1.Host :=FTPParam.PoxyHost;
IdSocksInfo1.Port :=FTPParam.PoxyPort;
if Trim(FTPParam.PoxyUserName)='' then
IdSocksInfo1.Authentication:=saNoAuthentication
else
begin
IdSocksInfo1.Authentication:=saUsernamePassword;
IdSocksInfo1.Username:=FTPParam.PoxyUserName;
IdSocksInfo1.Password:=FTPParam.PoxyPassWord;
end;
end
else
FftpClient.IOHandler:=Nil;
try
LogMessage('Connect to FTP Server '+FTPParam.Host+':'+IntToStr(FTPParam.Port));
FftpClient.Connect(True);
except
LogMessage('Connect FTP Server Error.');
end; end;上传函数
function Tfrm_main.FtpUpLoad(AData:TpeccImage;FPicName:String):boolean;
var
fname:String;
iPostion:integer;
begin
Result:=True;
fname:=UpperCase(FPicName);
if pos('.JPG',fname)>0 then
Delete(fname,pos('.JPG',fname),4); fname:=fname+AData.sort+'.JPG'; try
iPostion:=FftpClient.Size(fname);
finally
if iPostion=-1 then
iPostion:=0;
end;
if AData.sort='#3' then
LogMessage('Begin UpLoad File '+FPicName+' part'+AData.sort)
else
LogMessage('Begin UpLoad File Part'+AData.sort);
AData.stream.Position:=iPostion;
try
FftpClient.Noop;
FftpClient.Put(AData.stream,fname);
FftpClient.Noop;
except
on e:Exception do
begin
Result:=False;
LogMessage(e.Message);
logMessage('filename:='+fname);
end;
end;
Application.ProcessMessages;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货