Entwickler-Ecke
Internet / Netzwerk - IdHTTPServer Stream problem
Niko S. - Mo 28.12.09 16:27
Titel: IdHTTPServer Stream problem
Hallo Delphianer,
Ich versuch grad ein wenig mit IdHTTPServer zu arbeiten..
nun krieg ich das nicht nicht Grafiken zu senden..
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TServer.HTTPGetEvent(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin if (ARequestInfo.Document = '/favicon.ico') then begin MyStream := TFileStream.Create('.\favicon.ico', fmOpenRead); AResponseInfo.ContentStream := MyStream; AResponseInfo.ContentType := 'image/x-icon'; end; WriteLn(ARequestInfo.Command); WriteLn(ARequestInfo.RemoteIP); WriteLn(ARequestInfo.Document); end; |
Nun ich hab mich da nur so rumprobiert aber dieser Ansatz funktioniert nicht warum auch immer...
Er sagt mir nämlich, dass die Grafik fehler enthält.
Weiß da wer mehr als ich?
Gausi - Mo 28.12.09 16:38
Das einzige, was mir so direkt auffällt ist, dass du beim Laden des Streams keinen vollständigen Pfad angibst.
Funktioniert es denn mit anderen Dateien? Vielleicht stimmt mit der Grafik ja wirklich was nicht. ;-)
Niko S. - Mo 28.12.09 17:03
Och menno, es geht das einzige Problem war eig nur der Typ..
image/vnd.microsoft.icon
Ist der richtige type für Icons...
Danke trotzdem =D
Xentar - Mo 28.12.09 17:12
Und trotzdem solltest du dir absolute Dateipfade angewöhnen, sonst hast du früher oder später Probleme
Niko S. - Mo 28.12.09 17:30
Ich weiß, ich weiß, dass war jetzt auch nur mehr fürs testen gedacht ^^ Absolute Pfade werden dann gerade bei diesem Projekt mit Variablen festgelegt, irgendwie muss ich dem ja mitteilen wo der die Daten suchen soll =)
matze - Di 29.12.09 17:14
also für sowas gabs (soweit ich das noch weiß) eien Methode, die sich ServeFile() nannte...
EDIT:
Genau das wars: AResponseInfo.ServeFile()
Niko S. - Di 29.12.09 20:45
Okay, das wussste ich nicht ich probiers gleich mal aus, so wie ich das jetzt hab, funktioniert es zwar, ist aber doch recht umständlich finde ich und nicht gerade ellegant
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| ARequestInfo.Document := StringReplace(ARequestInfo.Document, '/', '\',[rfReplaceAll]); endung := ARequestInfo.Document; Delete(endung,1,1); ARequestInfo.Document := endung; endung := ExtractFileExt(ARequestInfo.Document); if not (FileExists(HomeDir+ARequestInfo.Document)) then begin MyStream := TFileStream.Create(HomeDir+ARequestInfo.Document, fmOpenRead); AResponseInfo.ContentStream := MyStream; AResponseInfo.ContentType := 'text/html'; end else if (endung = '.ico') then begin MyStream := TFileStream.Create(HomeDir+ARequestInfo.Document, fmOpenRead); AResponseInfo.ContentStream := MyStream; AResponseInfo.ContentType := 'image/vnd.microsoft.icon'; end else if (endung = '.png') then begin MyStream := TFileStream.Create(HomeDir+ARequestInfo.Document, fmOpenRead); AResponseInfo.ContentStream := MyStream; AResponseInfo.ContentType := 'image/png'; end else if (endung = '.html') or (endung = '.htm') then begin MyStream := TFileStream.Create(HomeDir+ARequestInfo.Document, fmOpenRead); AResponseInfo.ContentStream := MyStream; AResponseInfo.ContentType := 'text/html'; end else if (endung = '.php') then begin sl.LoadFromFile(HomeDir+ARequestInfo.Document); endung := sl.text; While (pos('<?php',endung) > 0) Do Delete(endung,pos('<?php',endung),pos('?>',endung)-pos('<?php',endung)+2); AresponseInfo.ContentText := endung; AResponseInfo.ContentType := 'text/html'; end else if (endung = '.css') then begin MyStream := TFileStream.Create(HomeDir+ARequestInfo.Document, fmOpenRead); AResponseInfo.ContentStream := MyStream; AResponseInfo.ContentType := 'text/css'; end; |
Muck - Di 29.12.09 21:02
Hallo,
hier ein Beispiel (nicht getestet) wie es funktionieren sollte. Ich verwende es ungefaehr so in meinem Server.
GetFileMIMEType setzt den ContentType fuer dich automatisch.
In dem Beispiel wird ResponseNo gesetzt und auch auf HEAD Anfragen reagiert.
Sollte so unter Delphi 2007 laufen, fuer Delphi 2009 musst Du ein paar Anpassungen durchfuehren.
RequestInfo = ARequestInfo etc...
bye
Markus
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| LocalDoc:=HomeDir+RequestInfo.Document; if fileexists(LocalDoc) then begin ResponseInfo.ResponseNo := 200; ResponseInfo.ContentType:=HTTPServer.MimeTable.GetFileMIMEType(LocalDoc); if AnsiSameText(RequestInfo.Command, 'HEAD') then begin ResultFile := TFileStream.create(LocalDoc, fmOpenRead or fmShareDenyWrite); try ResponseInfo.ContentLength := ResultFile.Size; finally ResultFile.Free; end; end else begin ResponseInfo.ServeFile(Context,LocalDoc); end end else begin ResponseInfo.ContentType:='text/HTML'; ResponseInfo.ResponseNo := 404; ResponseInfo.ContentText := '<html><head><title>Error</title></head><body><h1>' + ResponseInfo.ResponseText + '</h1></body></html>'; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!