Indy FTP 上传失败
使用简单的代码,例如:
procedure TForm1.cxButton1Click(Sender: TObject);
begin
ftp.Host := 'domain';
ftp.Username := 'user';
ftp.Password := 'password';
ftp.Connect;
ftp.Put('C:\_Projects\testpicture.JPG');
ftp.Quit;
ftp.Disconnect;
end;
我得到以下结果:
- 应用程序在上传时冻结(因此无法看到进度栏位置)。
- 上传的文件已损坏(损坏的内容超过几个字节)。
我到底做错了什么?
谢谢。
Using a simple code, such as:
procedure TForm1.cxButton1Click(Sender: TObject);
begin
ftp.Host := 'domain';
ftp.Username := 'user';
ftp.Password := 'password';
ftp.Connect;
ftp.Put('C:\_Projects\testpicture.JPG');
ftp.Quit;
ftp.Disconnect;
end;
I'm getting the following results:
- Application freezes while uploading (ergo unable to see Progress Bar position).
- Uploaded file goes corrupted (corrupts anything more than a few bytes).
What on earth am I doing wrong?
Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
应用程序冻结是因为 Indy 使用阻塞操作。当代码运行时,主消息循环并未运行,因此在
cxButton1Click()
退出之前不会处理新消息。要解决此问题,请将TIdAntiFreeze
组件放置到TForm
上,或者将TIdFTP
代码移动到单独的工作线程,然后使用 < code>TIdSync 或TIdNotify
在需要时安全地更新 UI。如果您以 ASCII 模式而不是二进制模式传输文件,该文件将被“损坏”。确保将
TIdFTP.TransferType
属性设置为ftBinary
。 Indy 9 及更早版本默认为ftBinary
,但 Indy 10 默认为ftASCII
(以匹配 FTP 协议规范)。The app freezes because Indy uses blocking operations. While the code is running, the main message loop is not running, so new messages are not being processed until
cxButton1Click()
exits. To solve that, either place aTIdAntiFreeze
component onto yourTForm
, or else move theTIdFTP
code to a separate worker thread, and then useTIdSync
orTIdNotify
to update the UI safely when needed.The file will be "corrupted" if you are transferring it in ASCII mode instead of in binary mode. Make sure the
TIdFTP.TransferType
property is set toftBinary
. Indy 9 and earlier defaulted toftBinary
, but Indy 10 defaults toftASCII
instead (to match the FTP protocol specs).