如何在Delphi中从HTTPS URL获取图像?
我正在尝试从URL开始加载如何在Delphi中从HTTPS URL获取图像?,delphi,indy,delphi-2007,Delphi,Indy,Delphi 2007,我正在尝试从URL开始加载TImage,如中所述 如果URL以一个简单的HTTP开头,所有这些都可以正常工作 当我尝试从HTTPS URL加载时,我得到一个EIdIOHandlerPropInvalid异常消息: IOHandler值无效 我尝试添加一个TIdSSLIOHandlerSocketOpenSSL,并将其设置为TIdHTTP组件的IOHandler 执行此操作后,我得到一个eidosslcoldnotloadssllibrary异常,并显示以下消息: 无法加载SSL库 属性中是否
TImage
,如中所述
如果URL以一个简单的HTTP开头,所有这些都可以正常工作
当我尝试从HTTPS URL加载时,我得到一个EIdIOHandlerPropInvalid
异常消息:
IOHandler值无效
我尝试添加一个TIdSSLIOHandlerSocketOpenSSL
,并将其设置为TIdHTTP
组件的IOHandler
执行此操作后,我得到一个eidosslcoldnotloadssllibrary
异常,并显示以下消息:
无法加载SSL库
属性中是否有错误或其他问题?您需要在Windows中安装SSL库(两个.DLL文件),或者随应用程序一起分发
似乎可以在这里下载:
或者通过他们的官方网站(但我在那里找不到可下载的二进制文件-只有源代码):
与Indy一起使用的预编译.dll可在此处下载:
(谢谢,Zed)您需要在Windows中安装SSL库(两个.DLL文件),或者随应用程序一起分发
似乎可以在这里下载:
或者通过他们的官方网站(但我在那里找不到可下载的二进制文件-只有源代码):
与Indy一起使用的预编译.dll可在此处下载:
(谢谢,泽德)
当我尝试从HTTPS URL加载时,我得到一个EIdIOHandlerPropInvalid
异常消息:
IOHandler值无效
该错误意味着您没有将TIdSSLIOHandlerSocketBase
派生组件附加到TIdHTTP.IOHandler
属性,例如TIdSSLIOHandlerSocketOpenSSL
此错误还告诉我,您使用的是过时的Indy版本,需要升级TIdHTTP
在请求HTTPS url时自动创建默认的SSLIOHandler
,当前未分配任何IOHandler
,并且
我尝试添加一个TIdSSLIOHandlerSocketOpenSSL
,并将其设置为TIdHTTP
组件的IOHandler
如果您不想升级,或者需要自定义SSLIOHandler
设置,例如启用TLS 1.1+(即tidsliohandlersocketopenssl
),这是正确的解决方案
执行此操作后,我得到一个eidosslcoldnotloadssllibrary
异常,并显示以下消息:
无法加载SSL库
这个错误意味着
- 您尚未在应用程序中部署OpenSSL dll(
和libeay32.dll
),或者至少在系统的某个位置安装了它们ssleay32.dll
- 您使用的DLL版本与您的Indy版本不兼容。Indy的当前版本支持OpenSSL 1.0.2及更早版本(支持OpenSSL 1.1.x)
IdSSLOpenSSLHeaders
单元中使用Indy的WhichFailedToLoad()
函数来确定故障的根本原因-DLL本身是否无法加载到内存中(因为找不到它们等),或者因为它们缺少Indy需要的特定导出
当我尝试从HTTPS URL加载时,我得到一个EIdIOHandlerPropInvalid
异常消息:
IOHandler值无效
该错误意味着您没有将TIdSSLIOHandlerSocketBase
派生组件附加到TIdHTTP.IOHandler
属性,例如TIdSSLIOHandlerSocketOpenSSL
此错误还告诉我,您使用的是过时的Indy版本,需要升级TIdHTTP
在请求HTTPS url时自动创建默认的SSLIOHandler
,当前未分配任何IOHandler
,并且
我尝试添加一个TIdSSLIOHandlerSocketOpenSSL
,并将其设置为TIdHTTP
组件的IOHandler
如果您不想升级,或者需要自定义SSLIOHandler
设置,例如启用TLS 1.1+(即tidsliohandlersocketopenssl
),这是正确的解决方案
执行此操作后,我得到一个eidosslcoldnotloadssllibrary
异常,并显示以下消息:
无法加载SSL库
这个错误意味着
- 您尚未在应用程序中部署OpenSSL dll(
和libeay32.dll
),或者至少在系统的某个位置安装了它们ssleay32.dll
- 您使用的DLL版本与您的Indy版本不兼容。Indy的当前版本支持OpenSSL 1.0.2及更早版本(支持OpenSSL 1.1.x)
出现错误后,您可以在
IdSSLOpenSSLHeaders
单元中使用Indy的WhichFailedToLoad()
函数来确定故障的根本原因-DLL本身是否无法加载到内存中(因为找不到它们等),或者因为它们缺少Indy需要的特定导出。我的应用程序是32位的,我将从openssl-1.0.2q-i386-win32.zip下载的libeay32.dll
和ssleay32.dll
放在可执行文件夹中。在错误之后,该错误导致加载失败函数结果:SSL\u CTX\u set\u info\u callback\u indy X509\u STORE\u CTX\u get\u app\u indy X509\u get\u not before\u indy X509\u get\u notAfter\u indy SSL\u SESSION\u id\u indy SSL\u SSL\u id\u CTX\u indy SSL\u indy SSL\u CTX\u获取版本\u indy SSL\u设置选项\u des奇偶校验码DLL与我的Indy版本不兼容。我用的是印地版
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;