Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi IdHttpServer JPG-Download (https://www.delphipraxis.net/201402-idhttpserver-jpg-download.html)

Hobbycoder 18. Jul 2019 18:22

IdHttpServer JPG-Download
 
Nachdem nun der File-Upload bei mir klappt, hakt es beim File-Download.
Um den vom IdHttpServer bereitgestellten Webseiten etwas Leben und Farbe zu geben, sind Grafiken unumgänglich.

Das einbauen über <img src="123.jpg"> klappt, das Bild wird auch beim Seitenaufbau vom Server abgerufen und auf der Festplatte gefunden, das habe ich überprüft.

Bereitgestellt wird es im TIdHttpServer.CommandGet, so wie alle anderen Dokumente auch, mit folgendem Code:
Delphi-Quellcode:
          AResponseInfo.ContentType:=GetMIMETyp(config.Pfade.Bilder+filename);
          fs:=TFileStream.Create(config.Pfade.BilderKrankmeldungen+filename, fmOpenRead or fmShareDenyWrite);
          AResponseInfo.ContentLength:=fs.Size;
          AResponseInfo.ResponseNo:=200;
          AResponseInfo.ContentStream:=fs;
Schaut auch alles soweit gut aus. Der Stream wird geöffnet, fs.Size passt auch, und Mime-Type wird auch korrekt gesetzt.

Aber: Der Browser stellt nur ein "broken"-Pic das. Wenn ich dann mit F12 in die Console von Chrome schaue, steht dort "ERR_CONTENT_LENGTH_MISMATCH".
Firefox stellt ebenfalls das Bild nicht dar. In der Konsole finde ich aber beim Download des Bildes:
Code:
GEThttp://127.0.0.1/%7B5064AB5F-5248-471D-B07E-523E990E6413%7D_Jaco%20Krause20190718_0.jpg
[HTTP/1.1 200 OK 11369ms]

Angefragte Adresse:http://127.0.0.1/%7B5064AB5F-5248-471D-B07E-523E990E6413%7D_XXX%2YYYY20190718_0.jpg
Anfragemethode:GET
Externe Adresse:127.0.0.1:80
Status-Code:
200
Version:HTTP/1.1
   
Antwortkopfzeilen (126 B)   
Kopfzeilen (unformatiert)
HTTP/1.1 200 OK
Connection: close
Content-Type: image/pjpeg
Content-Length: 617907
Date: Thu, 18 Jul 2019 17:01:33 GMT
Anfragekopfzeilen (400 B)   
Kopfzeilen (unformatiert)
Accept   
image/webp,*/*
Accept-Encoding   
gzip, deflate
Accept-Language   
de,en-US;q=0.7,en;q=0.3
Connection   
keep-alive
Cookie   
IDHTTPSESSIONID=TrOIAoyBthltjE8
Host   
127.0.0.1
Referer   
http://127.0.0.1/showbild.php
User-Agent   
Mozilla/5.0 (Windows NT 10.0; &#8230;) Gecko/20100101 Firefox/68.0
In der Netzwerkanalyse von Firefox wird jedoch bei dem Bild als Übertragungsmenge 3,09 kB angezeigt.

Hat einer eine Idee, wo mein Fehler liegen könnte? Ist das so, wie ich es oben mach (senden des Bildes), korrekt?

mjustin 18. Jul 2019 18:51

AW: IdHttpServer JPG-Download
 
Das Bild ist vermutlich 3,09 KB groß. Ich würde Indy die Ermittlung von AResponseInfo.ContentLength anvertrauen und daher die Zeile auskommentieren:

Delphi-Quellcode:
AResponseInfo.ContentLength := fs.Size;


Wild geraten: Delphi initialisiert fs.Size nicht korrekt

Delphi.Narium 18. Jul 2019 18:58

AW: IdHttpServer JPG-Download
 
In meinem Uraltwebserver hab' ich das (sinngemäß) so gemacht:
Delphi-Quellcode:
       
procedure TfmHTTPServerMain.HTTPServerCommandGet(AContext: TIdContext; RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var
  LocalDoc : String;
...
begin
  LocalDoc := config.Pfade.BilderKrankmeldungen + filename;
...
  AResponseInfo.ContentType  := GetFileMIMEType(LocalDoc);
...
  AResponseInfo.ContentLength := AResponseInfo.ServeFile(AContext,LocalDoc);
...
end;

freimatz 19. Jul 2019 09:22

AW: IdHttpServer JPG-Download
 
Wäre das Thema nicht besser bei Netzwerke aufgehoben? Da geht es um "(z.B. HTTP, FTP, Email, Internet bzw. Client <-> Server im Allgemeinen)"

arnof 19. Jul 2019 09:28

AW: IdHttpServer JPG-Download
 
hier mal meine Lösung:

bei INDY IdHTTP1 ist der Useragent hoch zu sezten, da manche Provider sonst den download blocken:

Code:
IdHTTP1.Useragent:='Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5 Build/NJH47F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36';
für https musst Du die entsprechende SSL Komponente zuweisen:

Code:
IdHTTP1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;

Code:
function ImageLoad(Picture: TPicture; FileName: string; WBImager:TWebBrowser=nil): Boolean;
var LStream: TMemoryStream;
  f: string;
  c: TCursor;
begin
  result := False;
  // Picture:=nil;
  if Trim(FileName) = '' then Exit;
  if WBImager<>nil then WBImager.Tag:=10; // keine Datei
  try
    if (Pos('http', lowercase(FileName)) > 0) or (Pos('www', lowercase(FileName)) > 0) then begin
      if WBImager<>nil then begin
       WBImager.Tag:=11; // Datei, aber noch nicht geladen
       if WBImager.Hint<>FileName then begin
        WBImager.Hint:=FileName;
        WBImager.Navigate(FileName);
       end;
       WBImager.Tag:=20; // Datei geladen
       result := True;
      end else begin
       LStream := TMemoryStream.Create;
       c := Screen.Cursor;
       Screen.Cursor := crHourGlass;
       try
        IdHTTP1.Get(FileName, LStream);
        LStream.Position := 0;
        f := Temp_Path + 'bild' + Copy(FileName, p_RInstr(0, FileName, '.'), 10);
        LStream.SaveToFile(f);
        Picture.LoadFromFile(f);
        result := True;
        FreeAndNil(LStream);
        DeleteF(f);
        result := True;
       except
        FreeAndNil(LStream);
       end;
       Screen.Cursor := c;
      end;
    end else begin
     if FileExists(FileName) then begin
       Picture.LoadFromFile(FileName);
       result := True;
     end;
    end;
  except
  end;
end;

Hobbycoder 19. Jul 2019 09:46

AW: IdHttpServer JPG-Download
 
Zitat:

Zitat von mjustin (Beitrag 1437022)
Das Bild ist vermutlich 3,09 KB groß. Ich würde Indy die Ermittlung von AResponseInfo.ContentLength anvertrauen und daher die Zeile auskommentieren:

Delphi-Quellcode:
AResponseInfo.ContentLength := fs.Size;


Wild geraten: Delphi initialisiert fs.Size nicht korrekt

Das Bild ist schon etwas über 600 KB groß. Aber ich habe es jetzt so gemacht:
Zitat:

Zitat von Delphi.Narium (Beitrag 1437023)
In meinem Uraltwebserver hab' ich das (sinngemäß) so gemacht:
Delphi-Quellcode:
       
procedure TfmHTTPServerMain.HTTPServerCommandGet(AContext: TIdContext; RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var
  LocalDoc : String;
...
begin
  LocalDoc := config.Pfade.BilderKrankmeldungen + filename;
...
  AResponseInfo.ContentType  := GetFileMIMEType(LocalDoc);
...
  AResponseInfo.ContentLength := AResponseInfo.ServeFile(AContext,LocalDoc);
...
end;

und so läuft es wunderbar ;-)

Danke euch beiden.

@arnof: es ging um IdHttpServer


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz