如何在Delphi中从HTTPS URL获取图像?

Fab*_*zio 1 delphi indy delphi-2007

我正在尝试从此答案中TImage说明的URL 加载开始。

uses
  GIFImg;

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream : TMemoryStream;
  GIF : TGIFImage;
begin
  Stream := TMemoryStream.Create;
  GIF := TGIFImage.Create;
  try
    IdHTTP1.Get('http://www.google.com/intl/en_ALL/images/logo.gif', Stream);
    //IdHTTP1.Get('https://www.google.com/intl/en_ALL/images/logo.gif', Stream);

    Stream.Position := 0;
    GIF.LoadFromStream(Stream);

    Image1.Picture.Assign(GIF);

  finally
    FreeAndNil(GIF);
    FreeAndNil(Stream);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

如果URL以简单的HTTP开头,则一切正常。

当我尝试从HTTPS URL加载时,出现EIdIOHandlerPropInvalid异常消息:

IOHandler值无效。

我尝试添加一个TIdSSLIOHandlerSocketOpenSSL并将其设置IOHandlerTIdHTTP组件。

在此处输入图片说明 在此处输入图片说明

完成此操作后EIdOSSLCouldNotLoadSSLLibrary,出现以下消息异常:

无法加载SSL库。

属性是否存在问题或其他问题?

Hea*_*are 7

您需要安装在Windows中或与应用程序一起分发的SSL库(两个.DLL文件)。

似乎可以在这里下载:

https://slproweb.com/products/Win32OpenSSL.html

或通过其官方网站(但我在那里找不到可下载的二进制文件-仅源代码):

https://www.openssl.org/source/

可以在此处下载与Indy一起使用的预编译的.DLL:

https://indy.fulgan.com/SSL/(感谢Zed)


Rem*_*eau 5

当我尝试从 HTTPS URL 加载时,收到一条EIdIOHandlerPropInvalid异常消息:

IOHandler 值无效。

该错误意味着您没有TIdSSLIOHandlerSocketBase附加到该TIdHTTP.IOHandler属性的派生组件,例如TIdSSLIOHandlerSocketOpenSSL.

此错误还告诉我您正在使用过时的 Indy 版本,需要升级。 请求 HTTPS url 时TIdHTTP自动创建默认值,并且当前未分配任何值,并且已经这样做了很长时间SSLIOHandlerIOHandler

我尝试添加 aTIdSSLIOHandlerSocketOpenSSL并将其设置为IOHandler组件TIdHTTP

如果您不想升级,或者需要自定义设置SSLIOHandler,例如启用 TLS 1.1+(TIdSSLIOHandlerSocketOpenSSL 默认情况下尚不执行),那么这是正确的解决方案。

执行此操作后,我收到EIdOSSLCouldNotLoadSSLLibrary异常并显示以下消息:

无法加载 SSL 库。

该错误意味着

  • 您还没有在您的应用程序中部署 OpenSSL DLL(libeay32.dllssleay32.dll),或者至少将它们安装在系统DLL 搜索路径上的某个位置。

  • 您使用的 DLL 版本与您的 Indy 版本不兼容。当前版本的 Indy 支持 OpenSSL 1.0.2 及更早版本(对 OpenSSL 1.1.x 的支持目前正在进行中)。

引发错误后,您可以使用单元WhichFailedToLoad()中的 Indy 函数IdSSLOpenSSLHeaders来确定失败的根本原因 - DLL 本身是否无法加载到内存中(因为找不到它们等),或者因为它们缺少特定的导出印地需要的。