Bild via Synapse und Weiterleitung runterladen [gelöst]

Alle Fragen zur Netzwerkkommunikation
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitrag von corpsman »

Servus,

Ich versuche verzweifelt eine Datei via synapse runter zu laden. Dazu habe ich die unten stehende Routine geschrieben.


Mein Problem ist nun, dass die erste URL nur eine Weiterleitung nach

https://s3.amazonaws.com/gs-geo-images/ ... 4f24_l.jpg

ist. Rufe ich die Routine mit der Weiterleitung auf, dann wird das Bild problemlos geladen. Nur leider gelingt es mir nicht den weiterleitungslink aus dem Ursprünglichen zu extrahieren. Hat einer von euch ne Idee wie ich das bewerkstelligen kann ?



Code: Alles auswählen

 
Function DownLoadFile(URL, Filename: String): Boolean;
Var
  f: TFileStream;
  m: TMemoryStream;
  sl: TStringList;
Begin
  result := false;
  With THTTPSend.Create Do Begin
// Versuch die Weiterleitung raus zu bekommen
    sl := TStringList.Create;
    If HttpGetText(url, sl) Then Begin
      showmessage(sl.text); // sl.text ist immer ''
    End;
// Wenn ich die URL von Hand setze, dann wird das bild sauber geladen
    url := 'https://s3.amazonaws.com/gs-geo-images/0b027a04-10ad-45b0-85c7-7957d8e94f24_l.jpg';
    m := TMemoryStream.Create;
    If HttpGetBinary(url, m) Then Begin
      Try
        If m.Size <> 0 Then Begin
          m.Position := 0;
          f := TFileStream.Create(Filename, fmOpenWrite Or fmCreate);
          f.CopyFrom(m, m.Size);
          f.Free;
          result := true;
        End;
      Except
      End;
    End;
    m.free;
    Free;
  End;
End;       
 
Aufruf mit :
 
 DownLoadFile('http://img.geocaching.com/cache/large/0b027a04-10ad-45b0-85c7-7957d8e94f24.jpg', 'test.jpg');
 
 
Zuletzt geändert von corpsman am So 21. Feb 2016, 09:59, insgesamt 1-mal geändert.
--
Just try it

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bild via Synapse und Weiterleitung runterladen

Beitrag von Michl »

Ich habe mal alles was loggt aus meiner Funktion rausgeschmissen (für weitergeleitete Pages geht es, für ein File habe ich jetzt nicht getestet). Das sieht dann so aus (evtl. geht es auch anders?):

Code: Alles auswählen

  var
    s: String;
  begin
    HTTP.Clear;
    Result := False;
    try
      if not HTTP.HTTPMethod('GET', URL) then Exit;
      if HTTP.ResultCode = 200 then Exit(True);
 
      HTTP.Headers.NameValueSeparator := ':';
      s := HTTP.Headers.Values['Location'];
      if Length(s) = 0 then Exit;
 
      HTTP.HTTPMethod('GET', s);                            //Versuche Redirection auszulesen
      if HTTP.ResultCode = 200 then Exit(True);
...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Bild via Synapse und Weiterleitung runterladen

Beitrag von m.fuchs »

Bei HTTP wird die Weiterleitungsadresse im Location-Header übertragen. Das kann man sich ganz gut ansehen, wenn man per Telnet einen händischen Request macht.

Code: Alles auswählen

$ telnet img.geocaching.com 80
Trying 63.251.163.214...
Connected to img.geocaching.com.
Escape character is '^]'.
GET /cache/large/0b027a04-10ad-45b0-85c7-7957d8e94f24.jpg HTTP/1.1
Host: img.geocaching.com
 
HTTP/1.1 301 Moved Permanently
Cache-Control: private
Location: https://s3.amazonaws.com/gs-geo-images/0b027a04-10ad-45b0-85c7-7957d8e94f24_l.jpg
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sun, 21 Feb 2016 08:32:21 GMT
Content-Length: 0


Um auf diesen Header Zugriff zu erhalten, musst du ein Objekt vom Typ THTTPSend verwenden. Du baust dir deinen Request zusammen und sendest ihn mit .HTTPMethod ab. Dann prüfst du, ob der Returncode ein Weiterleitungscode ist, suchst in diesem Fall das Location-Feld im zurückgegebene Header und rufst dieses noch einmal ab.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Bild via Synapse und Weiterleitung runterladen

Beitrag von corpsman »

Super, habe aus euren Antworten das hier gebastelt :


Code: Alles auswählen

 
Function DownLoadFile(URL, Filename: String): Boolean;
Var
  f: TFileStream;
  http: THTTPSend;
Begin
  result := false;
  http := THTTPSend.Create;
  Repeat
    If Not Http.HTTPMethod('GET', url) Then Begin
      http.free;
      exit;
    End;
    If http.ResultCode <> 200 Then Begin
      http.Headers.NameValueSeparator := ':';
      url := http.Headers.Values['Location'];
      If url = '' Then Begin
        http.free;
        exit;
      End;
      http.Clear;
    End;
  Until http.ResultCode = 200;
  If http.Document.Size <> 0 Then Begin
    f := TFileStream.Create(Filename, fmOpenWrite Or fmCreate);
    f.CopyFrom(http.Document, http.Document.Size);
    f.Free;
    result := true;
  End;
  http.free;
End;   


Und das Funktioniert ;)

Danke.
--
Just try it

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitrag von Michl »

PS: ein Repeat ... Until http.ResultCode = 200 ohne einen Zähler halte ich für kritisch.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitrag von corpsman »

*g*, so besser ?

Code: Alles auswählen

 
Function DownLoadFile(URL, Filename: String): Boolean;
const
  MaxTries = 10;
Var
  f: TFileStream;
  http: THTTPSend;
  tries: integer;
Begin
  result := false;
  http := THTTPSend.Create;
  tries := 0;
  Repeat
    If Not Http.HTTPMethod('GET', url) Then Begin
      http.free;
      exit;
    End;
    If http.ResultCode = 301 Then Begin
      http.Headers.NameValueSeparator := ':';
      url := http.Headers.Values['Location'];
      If url = '' Then Begin
        http.free;
        exit;
      End;
      http.Clear;
      tries := 0;
    End;
    inc(tries);
    if (tries >= Maxtries) then begin
      http.free;
      exit;
    end;
  Until http.ResultCode = 200;
  If http.Document.Size <> 0 Then Begin
    f := TFileStream.Create(Filename, fmOpenWrite Or fmCreate);
    f.CopyFrom(http.Document, http.Document.Size);
    f.Free;
    result := true;
  End;
  http.free;
End;
 
 
--
Just try it

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitrag von Michl »

corpsman hat geschrieben:*g*, so besser ?
Denke ja. Ich hatte schon mal den Fall, dass eine Weiterleitung zu der eigenen Weiterleitung stattgefunden hatte (gewollt oder nicht gewollt) und somit zu einer Endlosschleife wurde...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitrag von wp_xyz »

Die Unmenge von http.Free's könntest du noch sparen, indem du alles mit einen Try-finally Block umschließt:

Code: Alles auswählen

Function DownLoadFile(URL, Filename: String): Boolean;
const
  MaxTries = 10;
Var
  f: TFileStream;
  http: THTTPSend;
  tries: integer;
Begin
  result := false;
  http := THTTPSend.Create;
  try
    tries := 0;
    Repeat
      If Not Http.HTTPMethod('GET', url) Then
        exit;
      If http.ResultCode = 301 Then Begin
        http.Headers.NameValueSeparator := ':';
        url := http.Headers.Values['Location'];
        If url = '' Then
          exit;
        http.Clear;
        tries := 0;
      End;
      inc(tries);
      if (tries >= Maxtries) then begin
        exit;
      end;
    Until http.ResultCode = 200;
    If http.Document.Size <> 0 Then Begin
      f := TFileStream.Create(Filename, fmOpenWrite Or fmCreate);
      f.CopyFrom(http.Document, http.Document.Size);
      f.Free;
      result := true;
    End;
  finally
    http.free;
  end;
End;

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitrag von m.fuchs »

Hm, sehe ich noch etwas kritisch. Prüfe mal nicht ob der Code gleich 301 ist, sondern sich zwischen 300 und 399 befindet. Dann ist es ganz sicher eine Umleitung.

Übrigens: nur eine Prüfung ob der Location-Header existiert reicht auch nicht, der wird nicht nur für Umleitungen verwendet.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitrag von BeniBela »

Oder mit meinen Internet Tools:

Code: Alles auswählen

 
uses bbutils, simpleinternet;
strSaveToFileUTF8(FileName, retrieve(URL));
 


die kümmern sich um alles automatisch

(wobei ich das nochmal überarbeiten muss. Manche Leute wollen einer Weiterleitung nicht folgen, sondern die Originalseite, und das geht dann damit garnicht. Da muss eine Option für her)

Antworten