Delphi:使用URL Forwarding下载文件

时间:2012-01-15 06:24:44

标签: delphi url indy forwarding idhttp

我有一个免费域名,网址转发(隐藏)到另一个网站。

如果我在浏览器的网址中输入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

3 个答案:

答案 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属性。