Bild via Synapse und Weiterleitung runterladen [gelöst]

Alle Fragen zur Netzwerkkommunikation

Bild via Synapse und Weiterleitung runterladen [gelöst]

Beitragvon corpsman » 21. Feb 2016, 08:56 Bild via Synapse und Weiterleitung runterladen [gelöst]

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 21. Feb 2016, 09:59, insgesamt 1-mal geändert.
--
Just try it
corpsman
 
Beiträge: 1040
Registriert: 28. Feb 2009, 08:54
Wohnort: Stuttgart
OS, Lazarus, FPC: Kubuntu 14.04, Lazarus SVN Trunk, FPC 3.0 | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 21. Feb 2016, 09:33 Re: Bild via Synapse und Weiterleitung runterladen

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; 
Michl
 
Beiträge: 2243
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon m.fuchs » 21. Feb 2016, 09:35 Re: Bild via Synapse und Weiterleitung runterladen

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
m.fuchs
 
Beiträge: 1924
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon corpsman » 21. Feb 2016, 09:59 Re: Bild via Synapse und Weiterleitung runterladen

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
corpsman
 
Beiträge: 1040
Registriert: 28. Feb 2009, 08:54
Wohnort: Stuttgart
OS, Lazarus, FPC: Kubuntu 14.04, Lazarus SVN Trunk, FPC 3.0 | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 21. Feb 2016, 10:06 Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

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; 
Michl
 
Beiträge: 2243
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon corpsman » 21. Feb 2016, 10:35 Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

*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
corpsman
 
Beiträge: 1040
Registriert: 28. Feb 2009, 08:54
Wohnort: Stuttgart
OS, Lazarus, FPC: Kubuntu 14.04, Lazarus SVN Trunk, FPC 3.0 | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 21. Feb 2016, 10:55 Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

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; 
Michl
 
Beiträge: 2243
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon wp_xyz » 21. Feb 2016, 10:58 Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

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;
wp_xyz
 
Beiträge: 2480
Registriert: 8. Apr 2011, 08:01

Beitragvon m.fuchs » 21. Feb 2016, 11:41 Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

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
m.fuchs
 
Beiträge: 1924
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon BeniBela » 21. Feb 2016, 18:15 Re: Bild via Synapse und Weiterleitung runterladen [gelöst]

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)
BeniBela
 
Beiträge: 232
Registriert: 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4) | 
CPU-Target: 64 Bit
Nach oben

• Themenende •

Zurück zu Netzwerk



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron
porpoises-institution
accuracy-worried