【问题标题】:how to download/uplaod file over HTTPS using Indy 10 and OpenSSL in delphi?如何在 Delphi 中使用 Indy 10 和 OpenSSL 通过 HTTPS 下载/上传文件?
【发布时间】:2016-04-19 06:51:25
【问题描述】:

我希望我使用 Indy 下载文件。 我连接到 SSL 的问题。 请帮助我使用 HTTPS 或 SFTP 进行此操作。

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  IdFTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdFTP1);
  IdFTP1.UseTLS:=utUseRequireTLS;
  IdFTP1.DataPortProtection:=ftpdpsPrivate;
  IdFTP1.Host := '127.0.0.1';
  IdFTP1.Username := 'ftp';
  IdFTP1.Password := '123';
  IdFTP1.Port:=21;
  IdSSLIOHandlerSocketOpenSSL1.StartSSL;
  try
    IdFTP1.Connect;
    IdFTP1.Disconnect;
  finally
    IdFTP1.Free;
  end;
end;

【问题讨论】:

  • 请勿手动拨打StartSSL()。 Indy 会在适当的时候自动调用它。

标签: delphi ssl https sftp indy10


【解决方案1】:

你做对了(除了你释放的组件不是在相同的代码中创建的)。 HTTPS 也是如此。

IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create();
IdHTTP1.Get('https://...');

请注意,您需要 OpenSSL 库 https://indy.fulgan.com/ZIP/SSL.zip 或您想要的任何版本 https://indy.fulgan.com/SSL/

SFTP 和 FTPS 之间也有区别。 Indy 的 IdFTP 支持 SSL (FTPS)。它不能与 SFTP(使用 SSH 的 FTP)一起使用。 如果要使用 SFTP,则必须使用替代的商业组件 https://www.eldos.com/sbb/delphi-sftp.php

如果显示错误,您应该指定任何错误。可能只是缺少 SSL 库。 如果您不知道如何下载/上传文件,可以使用一些方法

IdFTP1.Put (upload)
IdFTP1.Get (download)

IdHTTP1.Put/Post (upload)
IdHTTP1.Get (download)

您将需要来自单元“IdMultipartFormData”的 TIdMultiPartFormDataStream 以便 HTTP Post 上传文件

【讨论】:

  • 仅供参考,如果您使用的是最新版本的 Indy,则无需手动将 TIdSSLIOHandlerSocketOpenSSL 分配给 TIdHTTP 即可使用 HTTPS。详情请见New HTTPS functionality for TIdHTTP
【解决方案2】:

你好,这是一个例子

function HttpGetFile(sUrl, sFile: String) : Boolean;
var
  GetData : TFileStream;
begin
  Result := False;
  try
    GetData := TFileStream.Create(sFile, fmOpenWrite or fmCreate);
    try
        //IdHTTP.ProxyParams.ProxyServer := '';
        //IdHTTP.ProxyParams.ProxyPort := 0;
        //IdHTTP.ProxyParams.ProxyUsername := '';
        //IdHTTP.ProxyParams.ProxyPassword := '';
        //IdHTTP.ProxyParams.BasicAuthentication := False;

        //IdHTTP.ProtocolVersion := pv1_1;
        //IdHTTP.Request.Pragma := 'no-cache';
        //IdHTTP.Request.Connection := 'Keep-Alive';
        //IdHTTP.Request.AcceptLanguage := 'en';
        //IdHTTP.Request.Referer := sTargetUrl;
        //NOTE needs files ssleay32.dll and libeay32.dll
        if (bSecure) and ( FileExists( ExtractFilePath(Application.ExeName) + 'ssleay32.dll')) 
       then begin
          IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := 
           sslvSSLv23;
          IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions :=
           [sslvSSLv2,sslvSSLv3,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];
          IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
          sTargetUrl := HTTPS+UPLOAD_URL;
        end
        else begin
          IdHTTP.IOHandler := nil;
          sTargetUrl := HTTP+UPLOAD_URL;      
        end;
          IdHTTP.Get(sUrl, GetData);

      Result := (IdHTTP.ResponseCode = 200);
    finally
      GetData.Free;
    end;
  except
    on E: EIdOSSLCouldNotLoadSSLLibrary do 
         ShowMessage(E.message);
    on E: EIdHTTPProtocolException do
         ShowMessage(E.message);
    on E: EIdConnClosedGracefully do
         ShowMessage(E.message);
    on E: EIdSocketError do
         ShowMessage(E.message);
    on E: EIdException do
         ShowMessage(E.message);
    on E: Exception do
      ShowMessage(E.message);
  end;
end;

【讨论】:

  • 设置SSLOptions.Method 属性会自动设置SSLOptions.SSLVersions 属性,反之亦然。您不需要在代码中同时设置它们。你应该坚持只使用SSLOptions.SSLVersions,让 Indy 在内部管理SSLOptions.Method
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 2012-10-28
  • 2013-09-02
  • 2013-04-28
  • 2011-01-12
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
相关资源
最近更新 更多