使用 Indy 将文件上传到 FTP 服务器
Upload file to FTP Server using Indy
我无法使用 Indy for Lazarus 将文件上传到我的 000webhost.com FTP 服务器。我已经用 Windows 命令提示符测试了 ftp 连接,它工作正常。这些是我的设置 (IdFTP):
IdFTP1.Host:='shabala.com';
IdFTP1.Passive:=True;
IdFTP1.TransferType:=ftBinary;
IdFTP1.Username:='******';
IdFTP1.Password:='******';
IdFTP1.Port:=21;
这是我用来调用我的 TIdFTP 组件的代码,IdFTP1:
IdFTP1.Connect(True);
//IdFTP1.ChangeDir('/Sessions');
IdFTP1.Put(GetCurrentDir+'\'+Token+'.cmd',Token+'.cmd', False);
IdFTP1.Quit;
IdFTP1.Disconnect;
其中变量 Token
声明为:
Token: String;
当我第一次 运行 程序时,它一直冻结,我声明了一个 TIdAntiFreeze 组件以防止它冻结。
所以,这就是现在发生的情况:有时程序工作正常,但没有文件 t运行sferred 到服务器(如果我尝试重复上传,它会给我一个 EIdAlredyConnected 错误),有时(如果我稍微更改一下代码,没什么额外的)它给了我一个带有 st运行ge 消息的 EIdProtocolReplyError。我试图捕获异常并让我的程序显示消息,我得到了一些 st运行ge 字符:
$ £ ï túÁÕÖ îÖõ)€¶K…ÅõÞl%ÇðåÀ¨Á“§pp
A¨%˜ßï7!ƒDªÉ[…oˆ_£P*¡°z1K¢H€Î¨ERPö/
üð΃ç±ïpļƒÏƒ‹Ò1ì
¿Á{»(g{å¥r…Ž¹öÐR_JúѯuBûŸ€Œ Pp6o¯c[JgžÎ¿Èà¦Ä€VJþz’0è–`BO@T
如果格式正确,响应如下所示:
我无法直接将格式化的文本放在这里。
服务器工作绝对正常,我尝试上传的目录被更改为 777,我发现文件的大小(我要上传的)不超过 3 KB。
有什么想法吗?
这些年来,我在使用 Indy Ftp 时遇到了一些问题。
在某些时候,我转向 OverbyteIcs (click ICS and then click Download ICS-V8.16 (Apr, 2015)) 的替代(免费)Ftp 客户端。
如果你不反对使用免费软件包,下面的代码将完成这项工作:
uses
...
OverbyteIcsFtpCli;
procedure FtpUploadFile(
HostName: String;
UserName: String;
Password: String;
UploadFileName: String;
ToHostDir : String );
var
FTP: TFtpClient;
begin
FTP := TFtpClient.Create(nil);
try
FTP.HostName := HostName;
FTP.Passive := True;
FTP.Binary := True;
FTP.Username := UserName;
FTP.Password := Password;
FTP.Port := '21';
if not FTP.Open then
raise Exception.Create('Failed to connect: ' + FTP.ErrorMessage);
if (not FTP.User) or (not FTP.Pass) then
raise Exception.Create('Failed to login: ' + FTP.ErrorMessage);
FTP.HostDirName := ToHostDir;
if not FTP.Cwd then
raise Exception.Create('Failed to change dir: ' + FTP.ErrorMessage);
FTP.LocalFileName := UploadFileName;
FTP.HostFileName := ExtractFileName(UploadFileName);
if not FTP.Put then
raise Exception.Create('Failed to upload file: ' + FTP.ErrorMessage);
finally
FTP.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FtpUploadFile('rubilaxe.hostoi.com',
'******', '******',
IncludeTrailingPathDelimiter(
ExtractFilePath(Application.ExeName) ) +'datafile.zip',
'/files' );
end;
我无法使用 Indy for Lazarus 将文件上传到我的 000webhost.com FTP 服务器。我已经用 Windows 命令提示符测试了 ftp 连接,它工作正常。这些是我的设置 (IdFTP):
IdFTP1.Host:='shabala.com';
IdFTP1.Passive:=True;
IdFTP1.TransferType:=ftBinary;
IdFTP1.Username:='******';
IdFTP1.Password:='******';
IdFTP1.Port:=21;
这是我用来调用我的 TIdFTP 组件的代码,IdFTP1:
IdFTP1.Connect(True);
//IdFTP1.ChangeDir('/Sessions');
IdFTP1.Put(GetCurrentDir+'\'+Token+'.cmd',Token+'.cmd', False);
IdFTP1.Quit;
IdFTP1.Disconnect;
其中变量 Token
声明为:
Token: String;
当我第一次 运行 程序时,它一直冻结,我声明了一个 TIdAntiFreeze 组件以防止它冻结。 所以,这就是现在发生的情况:有时程序工作正常,但没有文件 t运行sferred 到服务器(如果我尝试重复上传,它会给我一个 EIdAlredyConnected 错误),有时(如果我稍微更改一下代码,没什么额外的)它给了我一个带有 st运行ge 消息的 EIdProtocolReplyError。我试图捕获异常并让我的程序显示消息,我得到了一些 st运行ge 字符:
$ £ ï túÁÕÖ îÖõ)€¶K…ÅõÞl%ÇðåÀ¨Á“§pp
A¨%˜ßï7!ƒDªÉ[…oˆ_£P*¡°z1K¢H€Î¨ERPö/
üð΃ç±ïpļƒÏƒ‹Ò1ì
¿Á{»(g{å¥r…Ž¹öÐR_JúѯuBûŸ€Œ Pp6o¯c[JgžÎ¿Èà¦Ä€VJþz’0è–`BO@T
如果格式正确,响应如下所示:
我无法直接将格式化的文本放在这里。
服务器工作绝对正常,我尝试上传的目录被更改为 777,我发现文件的大小(我要上传的)不超过 3 KB。
有什么想法吗?
这些年来,我在使用 Indy Ftp 时遇到了一些问题。 在某些时候,我转向 OverbyteIcs (click ICS and then click Download ICS-V8.16 (Apr, 2015)) 的替代(免费)Ftp 客户端。 如果你不反对使用免费软件包,下面的代码将完成这项工作:
uses
...
OverbyteIcsFtpCli;
procedure FtpUploadFile(
HostName: String;
UserName: String;
Password: String;
UploadFileName: String;
ToHostDir : String );
var
FTP: TFtpClient;
begin
FTP := TFtpClient.Create(nil);
try
FTP.HostName := HostName;
FTP.Passive := True;
FTP.Binary := True;
FTP.Username := UserName;
FTP.Password := Password;
FTP.Port := '21';
if not FTP.Open then
raise Exception.Create('Failed to connect: ' + FTP.ErrorMessage);
if (not FTP.User) or (not FTP.Pass) then
raise Exception.Create('Failed to login: ' + FTP.ErrorMessage);
FTP.HostDirName := ToHostDir;
if not FTP.Cwd then
raise Exception.Create('Failed to change dir: ' + FTP.ErrorMessage);
FTP.LocalFileName := UploadFileName;
FTP.HostFileName := ExtractFileName(UploadFileName);
if not FTP.Put then
raise Exception.Create('Failed to upload file: ' + FTP.ErrorMessage);
finally
FTP.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FtpUploadFile('rubilaxe.hostoi.com',
'******', '******',
IncludeTrailingPathDelimiter(
ExtractFilePath(Application.ExeName) ) +'datafile.zip',
'/files' );
end;