1

私は、別のサイトへのURL 転送 (クローキング)を備えた無料のドメイン名を持っています。

ブラウザの Web アドレスに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 (ファイルの保存場所)からダウンロードします。

ありがとう!

編集:

HandleRedirectstrueに設定し、a を割り当てました (この質問Indy - IdHttp how to handle page redirects?CookieManagerは既に見ました)。

このhttp://liga-updates.ua.tc/GDI+.zipを Delphiにダウンロードしてみてください

4

3 に答える 3

3

問題の Web サイトは、実際の URL をロードする404を含む HTML ページを含むHTTP 応答を返しています。デフォルトでは、<iframe>応答により例外が発生します404。返信の内容 (HTML) には、プロパティを介してアクセスできます。TIdHTTPEIdHTTPProtocolExceptionEIdHTTPProtocolException.ErrorMessage

例えば:

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;
于 2012-01-19T00:10:43.310 に答える
1

http://liga-updates.ua.tcは、カスタム ページ (Web サーバーによって内部的に使用される) への 404 エラー リダイレクトに基づいているようです。

そこにある任意のリソースでhttp を実行してみてくださいhead。HTML 応答で 404 が返されます。その応答には、実際のダウンロード ファイルに対するiframe要素が含まれています。srcこれに基づいて、小さなコードを書きました。

THttpCliTIdHttp がステータス 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;
于 2012-01-17T00:46:03.493 に答える
0

コンポーネントのHandleRedirectsプロパティを試してください。TIdHTTP

于 2012-01-15T08:14:05.737 に答える