![]() |
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:
Schaut auch alles soweit gut aus. Der Stream wird geöffnet, fs.Size passt auch, und Mime-Type wird auch korrekt gesetzt.
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; 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:
In der Netzwerkanalyse von Firefox wird jedoch bei dem Bild als Übertragungsmenge 3,09 kB angezeigt.
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; …) Gecko/20100101 Firefox/68.0 Hat einer eine Idee, wo mein Fehler liegen könnte? Ist das so, wie ich es oben mach (senden des Bildes), korrekt? |
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 |
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; |
AW: IdHttpServer JPG-Download
Wäre das Thema nicht besser bei
![]() |
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:
für https musst Du die entsprechende SSL Komponente zuweisen:
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';
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; |
AW: IdHttpServer JPG-Download
Zitat:
Zitat:
Danke euch beiden. @arnof: es ging um IdHttpServer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz