浏览器示例
我有以下链接连接到我的IP摄像机使用用户名和密码的网址。
http://admin:password@192.168.1.13/ISAPI/Streaming/channels/102/picture
如果我在Internet Explorer中打开此链接,它会显示以下消息,并且无法打开链接。
Windows can not locate <link>. Check your spelling and try again
当我在Firefox的Chrome中打开相同的链接时,它工作正常,并显示所需的JPG图片。
** Delphi **
在 Delphi 中,我使用TIdHttp
从这个链接获取图片。
var
Ms: TMemoryStream;
PictureUrl: string;
begin
try
PictureUrl := 'http://admin:password@192.168.1.13/ISAPI/Streaming/channels/102/picture';
IdHTTP1.get(PictureUrl, MS);
Ms.Seek(0,soFromBeginning);
MS.SaveToFile('C:\Users\karat\Documents\hikivision1.jpg');
finally
FreeAndNil(MS);
end;
end;
该代码与另一个jpg图像链接一起工作,问题是此代码获得了一个178字节的MemoryStream,这意味着图片没有被加载。
我把一个TWebBrowser
的形式,我发现它是给我同样的错误,在Internet Explorer浏览器,浏览器不支持加载这种类型的网址。
**翻译:**无法访问此页面。请检查您的链接是否正确。
解决方案
我假设如果我找到一种方法让TIdHttp
像Chrome和Firefox一样运行,它会正确加载所需的图片。
2条答案
按热度按时间5sxhfpxr1#
Delphi 在VCL中的
TWebBrowser
组件只是IE的一个 Package 器。您所展示的代码在调用
TIdHTTP.Get()
之前没有创建TMemoryStream
对象。这只是一个打字错误,还是您的真实的代码实际上忘记了这样做?虽然Indy确实可以从URL解析用户名/密码,并且确实支持密码中的
@
字符,但由于您已经提前知道了这些值,因此您应该将它们显式地放在TIdHTTP.Request
的UserName
/Password
属性中,而不是放在URL中,例如:如果这仍然不起作用,那么有可能是Web服务器对UserAgent敏感,为不同的Web浏览器提供不同的内容。(
'Mozilla/3.0 (compatible; Indy Library)'
,可以通过IdHTTPHeaderInfo
单元中的GIdDefaultUserAgent
变量全局更改),因此尝试更改UserAgent
以模拟您选择的真实的Web浏览器,如Chrome或FireFox,例如:yyhrrdl82#
如果未运行,则尝试另外设置以下内容:
请求.基本身份验证:=假; HTTP选项:= [如何在处理验证中,如何强制编码参数];