Delphi Indy IDhttp Problem z nazwą pliku

0

chcę pobrać plik z internetu ale niestety nie mam jak ustalić jego nazwy. Dane przesyłane są w nagłówku a ja niestety nie wiem jak je wyciągnąć.

Opis problemu:
pobieram plik z serwera http://serwer1.com/plik.php metodą post
Ten serwer przekierowuje mnie dalej na drugi serwer
http://serwer2.com/dl.php?jakieś losowe parametry (get).

problem w tym że dopiero drugi serwer podaje w nagłówku nazwę pliku.
Content-Disposition=attachment; filename="0001.pdf"
w Jaki sposób mogę ustalić nazwę tego pliku w programie.

Wspomnę że korzystam z IDhttp

Była bym wdzięczna za jakieś przykłady kodu.</delphi>

0

Skoro masz problemy z Indy, to ja tradycyjnie polecam pakiet Synapse oraz komponent THttpSend
wchodzący w jego skład. Jeżeli wysyłasz nim dane POSTem to jeżeli zwrócony ResultCode - będzie
wynosił 301 albo 302 - to z nagłowków (Headers - są typu TStringList tak jak Cookies) wyciągasz
Locaction, jak znowu nastąpi przekierowanie lub nie, a w nagłowkach masz nazwę pliku to także i
ją możesz łatwo pobrać. A poniżej przykładowy kod, ktory z użyciem modułu httpsend - z pakietu
Synapse loguje się na stronę pewnego szczecińskiego klubu. Program pobiera zdjęcia z galerii, co
są dostepne dopiero po zalogowaniu. Jak widzisz obsługiwane jest przekierowanie. Powinnaś imo
na podstawie tego fragmentu zrozumieć ideę. Więcej jest do znalezienia w google oraz pomocna
może się też okazać oczywiście dokumentacja pakietu. Jednak jeżeli uprzesz się przy Indy, to ja
niewiele jestem w stanie doradzić. Ja od dłuższego czasu staram się trzymać od indy z daleka ;/

//...
const
  Base_Url = 'http://www.heyaclub.pl/';
  Profile_Page = 'index.php?go=profil';
  Gallery_Page = 'index.php?go=galeria';
  Gallery_SubPage = '&page=';
  ToPost_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
// ...
function HeyaPostToMemoryStream(const URL : string;
  HeyaUserName, HeyaPassword : string; const MemoryStream : TMemoryStream) : boolean;
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  OldCookie, UrlData, Str, DirectLink : string;
begin
  OldCookie := '';
  SynHttp := THttpSend.Create;
  try
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Base_Url);
    OldCookie := SynHttp.Cookies.Text;
    SynHttp.Clear;
    SynHttp.Cookies.Text := OldCookie;
    SynHttp.MimeType := ToPost_MimeType;
    URLData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
    SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
    Result := SynHttp.HTTPMethod('POST', Url);
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;
          HeyaPostToMemoryStream(DirectLink, HeyaUserName, HeyaPassword, MemoryStream);
        end;
    else
      MemoryStream.Clear;
      SynHttp.Document.SaveToStream(MemoryStream);
      MemoryStream.Position := 0;
    end;
  finally
    SynHttp.Free;
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1