我有一个免费域名,网址转发(隐藏)到另一个网站。
如果我在浏览器的网址中输入http://my.com/1.zip,则会转到http://his.com/1.zip并下载文件。
如何使用Indy TIdHTTP(Delphi XE2)进行相同操作。浏览器和我最初得到404错误但后来他们以某种方式下载了除我之外的文件。
我需要使用第一个链接,但实际上是从另一个网站下载的。例如。第一个站点有一个xxx.zip文件。我想转到http://my.com/xxx.zip,但实际上是从http://his.com/xxx.zip下载(文件存储的地方)。
谢谢!
我将HandleRedirects
设为true,分配了CookieManager
(我已经看过这个问题Indy - IdHttp how to handle page redirects?)。
尝试在Delphi中下载这个http://liga-updates.ua.tc/GDI+.zip
答案 0 :(得分:2)
相关网站正在返回一个HTTP 404
响应,其中包含一个加载真实网址的<iframe>
的HTML网页。默认情况下,404
回复会导致TIdHTTP
引发EIdHTTPProtocolException
例外。可以通过EIdHTTPProtocolException.ErrorMessage
属性访问回复内容(HTML)。
例如:
procedure TForm1.Button1Click(Sender: TObject);
var
Http: TIdHttp;
URL, Filename: string;
FS: TFileStream;
...
begin
Filename := 'C:\path\GDI+.zip';
URL := 'http://liga-updates.ua.tc/GDI+.zip';
FS := TFileStream.Create(Filename, fmCreate);
try
try
Http := TIdHttp.Create(nil);
try
try
Http.Get(URL, FS);
except
on E: EIdHTTPProtocolException do begin
if E.ErrorCode <> 404 then raise;
URL := ParseIFrameURLFromHTML(E.ErrorMessage);
if URL = '' then raise;
Http.Get(URL, FS);
end;
end;
finally
Http.Free;
end;
finally
FS.Free;
end;
except
DeleteFile(Filename);
ShowMessage('Unable to download file.');
Exit;
end;
ShowMessage('Downloaded OK');
end;
答案 1 :(得分:1)
似乎http://liga-updates.ua.tc基于404错误重定向到自定义页面(由Web服务器内部使用)。
尝试在那里的任何资源上执行http head
:它将返回带有HTML响应的404。
该响应将iframe
元素与src
保存到实际下载文件中。
基于此,我写了一个小代码。
我使用了THttpCli
,因为似乎TIdHttp不会返回状态为404的“有效”响应(无论如何都不在我的D5版本中)。
uses HttpProt;
procedure TForm1.Button1Click(Sender: TObject);
const
IFRAME_SRC = '<iframe src="';
var
HttpCli: THttpCli;
S, URL, FileName: string;
I: Integer;
FS: TFileStream;
begin
URL := 'http://liga-updates.ua.tc/GDI+.zip';
HttpCli := THttpCli.Create(nil);
try
HttpCli.URL := URL;
HttpCli.MultiThreaded := True;
try
HttpCli.Get;
except
// this will always be 404 for this domain (test from outside the IDE)
end;
S := HttpCli.LastResponse; // THttpCli returns valid response when status 404
// extract IFRAME src
I := Pos(IFRAME_SRC, S);
if I <> 0 then
begin
Delete(S, 1, I + Length(IFRAME_SRC) - 1);
URL := Copy(S, 1, Pos('"', S) - 1);
HttpCli.URL := URL;
FileName := ExtractFileName(StringReplace(URL, '/', '\', [rfReplaceAll]));
FS := TFileStream.Create(FileName, fmCreate);
try
HttpCli.RcvdStream := FS;
try
HttpCli.Get;
ShowMessage('Downaloded OK');
except
ShowMessage('Unable to download file.');
end;
finally
FS.Free;
end;
end
else
ShowMessage('Unable to extract download information.');
finally
HttpCli.Free;
end;
end;
答案 2 :(得分:0)
尝试HandleRedirects
组件的TIdHTTP
属性。