首页 > 解决方案 > Indy IdFtp - 网络连接被本地系统中止

问题描述

我使用 Indy 10 和TIdFTP组件。它使用 FTP 协议,但是当我想.zip通过 FTPS/SSL 将文件上传到服务器时出现此错误。

加密:需要基于 TLS 的显式 FTP

错误是:

网络连接被本地系统中止

这是我的代码:

var
  fileList: TStringList;
  i : integer;
  ToUpload : String;
  fs: TFileStream;
  LHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  try
    LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    with IdFTP1 do
    begin
      if chkSSL.Checked then
      begin
        IOHandler := LHandler;
        LHandler.SSLOptions.SSLVersions := [sslvSSLv3,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];
        LHandler.SSLOptions.Mode := sslmClient;
        UseTLS := utUseExplicitTLS;
        DataPortProtection := ftpdpsPrivate;
      end;
      if IdFTP1.Connected then
        Disconnect;
      Username := edUserName;
      Password := edPassword;
      Host := edAddress;
      if not Connected then
        Connect;
    end;
    IdFTP1.ChangeDir(edPath + 'LocalXMLs/');
    
    if FileExists(ExtractFilePath(Application.ExeName)+'XMLs\LocalXMLs\LocalXMLs.zip') then
    begin
      ToUpload := ExtractFilePath(Application.ExeName)+'XMLs\LocalXMLs\LocalXMLs.zip';
      try
        try
          CurrStep := 3;
          Application.ProcessMessages;
          prgTotal.Max := 1;
          ToUpload := ExtractFilePath(Application.ExeName)+'XMLs\LocalXMLs\LocalXMLs.zip';
          try
            try
              fs := TFileStream.Create(ToUpload, fmOpenRead);
              IdFTP1.TransferType := ftBinary;
              IdFTP1.Put(fs, ExtractFileName(ToUpload));
              Memo1.Lines.Add('3.Upload LocalXMLs.zip OK');
            except
              on E: Exception do
              begin
                Memo1.Lines.Add('Error: '+ e.Message);
                FPut := true;
              end;
            end;
          finally
            fs.Free;
          end;
        except
          on E: Exception do
          begin
            Memo1.Lines.Add('Error: '+ e.Message);
            FPut := true;
          end;
        end;
      finally
        //fs.Free;
      end;
    end;
  finally
    IdFTP1.Quit;
    Screen.Cursor := crDefault;
    prgTotal.Position := 0;
    LHandler.Free;
    FPut := true;
  end;
end;

我称这种方法为:

FPut := false;
UploadXmlFilesWithIDFTP;
while not FPut do
  Application.ProcessMessages;
...
procedure TFm_SyncMain.IdFTP1WorkEnd(Sender: TObject;
  AWorkMode: TWorkMode);
begin
  FGet := True;
  FPut := True;
  edSizeInfo.Text := 'completed.';
  prgTotal.Position := 0;
end;

我做错了什么?

标签: delphi-7indyindy10

解决方案


推荐阅读