AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IdHttpServer JPG-Download

Ein Thema von Hobbycoder · begonnen am 18. Jul 2019 · letzter Beitrag vom 19. Jul 2019
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
961 Beiträge
 
#1

IdHttpServer JPG-Download

  Alt 18. Jul 2019, 19:22
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?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: IdHttpServer JPG-Download

  Alt 18. Jul 2019, 19:51
Das Bild ist vermutlich 3,09 KB groß. Ich würde Indy die Ermittlung von AResponseInfo.ContentLength anvertrauen und daher die Zeile auskommentieren:

AResponseInfo.ContentLength := fs.Size;

Wild geraten: Delphi initialisiert fs.Size nicht korrekt
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#3

AW: IdHttpServer JPG-Download

  Alt 18. Jul 2019, 19:58
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;
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: IdHttpServer JPG-Download

  Alt 19. Jul 2019, 10:22
Wäre das Thema nicht besser bei Netzwerke aufgehoben? Da geht es um "(z.B. HTTP, FTP, Email, Internet bzw. Client <-> Server im Allgemeinen)"
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.254 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: IdHttpServer JPG-Download

  Alt 19. Jul 2019, 10:28
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;

Geändert von arnof (19. Jul 2019 um 10:30 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
961 Beiträge
 
#6

AW: IdHttpServer JPG-Download

  Alt 19. Jul 2019, 10:46
Das Bild ist vermutlich 3,09 KB groß. Ich würde Indy die Ermittlung von AResponseInfo.ContentLength anvertrauen und daher die Zeile auskommentieren:

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:
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
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 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