![]() |
AW: Webbroker. PageProducer und transparente HTML-Tags
/ ist das Rootverzeichnis des Webservers.
Er kann alles an den anfordernden Client / Browser liefern, was sich in diesem Verzeichnis oder unterhalb davon befindet. Hier mal eine Mini-HTML-Seite, die nur zum Testen gedacht ist:
Code:
Dieses bisserl HTML speicherst Du bitte in eine Datei namens index.html und zwar in das Verzeichnis html.
<html>
<head> <title>index.html</title> </head> <body> <h1>Siehst Du mich?</h1> <h6>Mein Name ist index.html</h6> </body> </html> Nun wechselst Du zum Browser und gibst dort
Delphi-Quellcode:
ein.
http://localhost:8080/index.html
Bekommst Du die Datei zu sehen? Wenn ja, so ist das HTML-Verzeichnis das Rootverzeichnis des Webservers. Dann müssen alle Dateien, die über den Webserver geliefert werden sollen, in diesem Verzeichnis oder in darunterliegenden Verzeichnissen liegen. Bekommst Du die Datei nicht zu sehen? Dann verschiebe sie in das Verzeichnis oberhalb von html und überprüfe, ob der Browser sie Dir nun (bei unveränderter Url also über
Delphi-Quellcode:
) anzeigen kann.
http://localhost:8080/index.html
Wenn ja, so hast Du das Rootverzeichnis gefunden. Wenn nein, so verschiebe die Datei solange im Verzeichnisbaum, bis Du sie im Browser angezeigt bekommst. Bitte erstelle keine Kopieen der Datei, damit Du sicherstellen kannst, dass die Datei, die (hoffentlich) im Browser angezeigt wird, nur einmal vorhanden ist, damit Du mit Sicherheit sagen kannst: Der Browser hat mir die index.html angezeigt und nicht irgendeine von werweißwievielen. Eigentlich müsste das Rootverzeichnis aber (egal bei welchem Webserver auch immer) irgendwo in der Konfiguration zu finden sein. Welchen Webserver nutzt Du denn aktuell? Die Pfadangaben innerhalb Deiner Webanwendung haben übrigens nichts damit zu tuen. Sie dienen nur der Zuordnung innerhalb der Webanwendung. Hier mal ein Auszug aus 'ner in die Jahre gekommenen ISAPI.DLL:
Delphi-Quellcode:
Die Pathinfo hier dient nur dazu, dass innerhalb der Webanwendung entschieden werden kann, welche Routine der Webanwendung zur Ausgabe des Response genutzt werden soll.
Actions = <
item Default = True Name = 'wai' PathInfo = '/' OnAction = wmwaiAction end item Name = 'waiIndex' PathInfo = '/Index' OnAction = wmwaiIndexAction end item Name = 'waiReload' PathInfo = '/Reload' OnAction = wmwaiReloadAction end item Name = 'waiBottom' PathInfo = '/Bottom' OnAction = wmwaiBottomAction end item Name = 'waiTop' PathInfo = '/top' OnAction = wmwaiTopAction end item Name = 'waiEdit' PathInfo = '/Edit' OnAction = wmwaiEditAction end item Name = 'waiSave' PathInfo = '/Save' OnAction = wmwaiSaveAction end item Name = 'waiSearch' PathInfo = '/Search' OnAction = wmwaiSearchAction end item Name = 'waiKomplettliste' PathInfo = '/Komplettliste' OnAction = wmwaiKomplettlisteAction end item Name = 'waiAbfragen' PathInfo = '/Abfragen' OnAction = wmwaiAbfragenAction end item Name = 'waiUpdate' PathInfo = '/update' OnAction = wmwaiUpdateAction end item Name = 'waiQTVAbfrage' PathInfo = '/qtv' OnAction = wmwaiQTVAbrageAction end item Name = 'waiQTVLoadFile' PathInfo = '/QTVLoadFile' OnAction = wmwaiQTVLoadFileAction end> Mögliche Urls für den obigen Auszug könnten also so aussehen (die ISAPI-Dll "hört auf den Namen WebMenu.dll"):
Code:
Diese Pfadangaben sind absolut unabhängig von der Verzeichnisstruktur der verwendeten Templates oder der Verzeichnisstruktur des Webservers.
http://localhost:8080/WebMenu.dll/
http://localhost:8080/WebMenu.dll/Index http://localhost:8080/WebMenu.dll/Search Die IMG-Tags in den auszugebenden HTML-Seiten müssen sich daher an die Verzeichnisstruktur des Webservers halten und nicht an die Verzeichnisstruktur der Webanwendung. Es mag sein, dass die Verzeichnisstruktur der Webanwendung mit der des Webservers übereinstimmt, aber das ist nicht zwingend erforderlich und kann auch nicht als Vorraussetzung erwartet werden. Auch die von der Webanwendung genutzten Templates, für die Erstellung der HTML-Seiten, können sich ausserhalb des Zugriffs des Webservers befinden. Im Zugriff des Webservers muss sich alles befinden, was von diesem selbst, ohne Hilfe einer Webanwendung, ausgeliefert werden soll. Hierzu gehören für gewöhnlich die Bilder, CSS-Dateien ... Vom Ablageort eines HTML-Templates, in einer Verzeichnisstruktur, kann man daher nicht zwingend auf den "korrekten" Ablageort von Bildern, auf die im Template verlinkt werden soll, schließen. |
AW: Webbroker. PageProducer und transparente HTML-Tags
Hi zusammen
Mal die Prozedur des Defaulthandlers, wie sie zur Zeit besteht - die hat sich etwas weiter entwickelt, seit ich sie zum ersten mal gepostet habe:
Delphi-Quellcode:
Da besteht zurzeit das Problem, das die PathInfo "/" nicht behandelt wird, weshalb alles hängt. Ein Durchsteppen durch diesen Code hat folgendes gezeigt
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin if Request.PathInfo = '/html/AufromantischerSpur1.html' then WebModule1WebActRomanticeRoadAction(Self,Request,Response,Handled); if Request.PathInfo = '/html/DynamicDelborHome.html' then WebModule1WebActHomeAction(Self,Request,Response,Handled); if Request.PathInfo = '/Images/Logo/Delbor_8.jpg' then WebModule1WebActImagesAction(Self,Request,Response,Handled); end;
Delphi-Quellcode:
Das stützt eigentlich die Aussage, das der Browser alles, was im HTML referenziert wird und kein Link ist (der ja eine komplett andere Webeite anfordert), erneut anfragt. Offen bleibt hier für mich allerdings die Frage, ob ich da nicht einen Fehler mache, wenn ich hier die Antwort schon abschicke?
procedure TWebModule1.WebModule1WebActHomeAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerHome.Content; // Response.Content := Response.Content + PageProducerLogo.Content; // Response.Content := Response.Content + 'Request.PathInfo := ' + Request.PathInfo; Response.SendResponse; end; Andrerseits müsste ich hier ein Bild in einen Stream laden, und den kann ich nicht so einfach an Content übergeben. Will heissen:
Delphi-Quellcode:
ist nicht möglich
Response.Content + PageProducerLogo.ContentStream
Spannend bleibts auf jeden Fall. Wenn ich so weiterfahre, wie oben im Defaulthandler gezeigt, hab ich bald einmal mehrere A4-Seiten voll if..Then-Abfragen... Was wiederum heisst: so, wie ichs jetzt mache, ists alles andere alls optimal. @nahpets: Gerade wollte ich mir vorm abschicken nochmal die Vorschau anzeigen lassen, da hab ich deinen Beitrag gesehen, Den muss ich mir aber etwas genauer zu Gemüte führen und werde deshalb gesondert darauf eingehen. Zumindest mal danke dafür! Auch an alle anderen, die soviel Geduld mit einem Greenhorn wie mir haben! Gruss Delbor |
AW: Webbroker. PageProducer und transparente HTML-Tags
Zu:
Delphi-Quellcode:
Du solltest in deiner Anwendung mit dem Auslifern der Bilder eigentlich gar nichts zu tun haben!!!!
if Request.PathInfo = '/Images/Logo/Delbor_8.jpg' then
WebModule1WebActImagesAction(Self,Request,Response,Handled); Diese Pathinfo ist also gar nicht nötig! Das (nach)laden der Bilder muss automatisch erfolgen!!! |
AW: Webbroker. PageProducer und transparente HTML-Tags
Das Ausliefern eines Bildes über eine Webapplikation könnte grob so aussehen:
Delphi-Quellcode:
Die passende Url dazu würde dann ungefähr so aussehen:
// PathInfo: /Images
procedure TWebModule1.ImagesAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Var fs : tFileStream; sFile : String; begin Try // Die Pfadangabe sollte natürlich konfigurierbar sein. // Relative Pfade könnten auch möglich sein. // Dann gilt aber: Relativ ausgehend von der Webserver.Exe. sFile := Format('E:\DelphiXE8%20Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\%s', [Request.QueryFields.Values['Image']]); fs := tFileStream.Create(sFile,fmOpenRead); Try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; Except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; End; Finally fs.Free; End; Handled := True; end;
Delphi-Quellcode:
Ausgehend von dem oben im Quelltext "festverdrahteten" Pfad, wäre aber auch sowas möglich:
http://localhost:8080/NameDeinerWebanwendung/Images?Image=Delbor_8.jpg
Delphi-Quellcode:
http://localhost:8080/NameDeinerWebanwendung/Images?Image=Logo/Delbor_8.jpg
|
AW: Webbroker. PageProducer und transparente HTML-Tags
Hi zusammen
@Jumpy Zitat:
Ich denke, eine nur auf dem IdHTTPServer basierende Anwendung würde dies wohl tun - zumindest habe ich das 'Eliza'-Beispielprogramm der Indys so in Erinnerung. @nahpets Ich habe deinen kleinen Test mal umgesetzt. Allerdings habee ich die Datei in 'idextest' umbenannt, da ich selbst eine Datei Index.html habe. Bei mir sieht das allerdings wohl etwas anders aus, als du beabsichtigt hast. Grund dafür ist, dass ich keinen Webserver (sprich IIS) am laufen habe. Meine Anwendung ist ein Standalone-Webbroker. Und der erzeugt bei Programmstart eine Instanz des IDHTTPServer-Abkömmlings TIdHTTPWebBrokerBridge, ist also eigentlich eine IDHTTPServer-Anwendung. Der Defaulthandler:
Delphi-Quellcode:
WebModule1WebActindextest:
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin if Request.PathInfo = '/html/AufromantischerSpur1.html' then WebModule1WebActRomanticeRoadAction(Self,Request,Response,Handled); if Request.PathInfo = '/html/DynamicDelborHome.html' then WebModule1WebActHomeAction(Self,Request,Response,Handled); if Request.PathInfo = '/Images/Logo/Delbor_8.jpg' then WebModule1WebActImagesAction(Self,Request,Response,Handled); if Request.PathInfo = '/indextest.html' then WebModule1WebActindextest(Self,Request,Response,Handled); //<== end; Zitat:
Und die zeigt mir der Browser dann auch an. Gruss Delbor |
AW: Webbroker. PageProducer und transparente HTML-Tags
Zitat:
![]() |
AW: Webbroker. PageProducer und transparente HTML-Tags
Hi nahpeds
Zitat:
Gruss Delbor |
AW: Webbroker. PageProducer und transparente HTML-Tags
Hi Jumpy
Ich habe diese Anwendung mit diesem ![]() Unter DelphiXE4 Pro hatte ich keine Möglichkeiten, mit Datsnap zu arbeiten und deshalb mit reinen Webbroker-Anwendungen gearbeitet. Dabei hatte ich auch diee Anwendung auch als ISAPI-Projekt zu erstellen versucht, bin aber unter anderem an der Konfiguration des IIS gescheitert. Zurzeit habe ich allerdings den Verdacht, dass dies das kleinste Problem war... Gruss Delbor |
AW: Webbroker. PageProducer und transparente HTML-Tags
Hi nahpeds
Delphi-Quellcode:
Was genau sollte der Formatstring bewirken?
Try
// Die Pfadangabe sollte natürlich konfigurierbar sein. // Relative Pfade könnten auch möglich sein. // Dann gilt aber: Relativ ausgehend von der Webserver.Exe. sFile := Format('E:\DelphiXE8%20Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\%s', [Request.QueryFields.Values['Image']]); Abgesehen davon: Es wird nicht ohne relative Pfade gehen. Das Rootverzeichnis meines Webspaces ist'\'. Gruss Delbor PS: Ich hatte eine Fehlermeldung erhalten, die ich zu kopieren vergessen hatte. Die reiche ich jetzt nach: Zitat:
|
AW: Webbroker. PageProducer und transparente HTML-Tags
Ok, der Fehler in der Formatanweisung liegt in der Pfadangabe.
Delphi-Quellcode:
Die %20 müssen ein Leerzeichen sein, ansonsten stört das % in der Zeichenfolge.
Try
// Die Pfadangabe sollte natürlich konfigurierbar sein. // Relative Pfade könnten auch möglich sein. // Dann gilt aber: Relativ ausgehend von der Webserver.Exe. sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\%s', [Request.QueryFields.Values['Image']]); Wenn die Dateien unterhalb Deiner Applikation liegt, geht aus sowohl mit absoluten, als auch mit relativen Pfaden. Wenn Du in Deinen Webseiten Urls dieser Art benutzt
Delphi-Quellcode:
, dann kannst Du in Deinem Programm über
http://localhost:8080/NameDeinerWebanwendung/Images?Image=Delbor_8.jpg
Delphi-Quellcode:
die Werte abfragen, die sich in der Url hinter dem ? und getrennt durch & befinden.
Request.QueryFields.Values
Wenn Du also im Quelltext die Url
Delphi-Quellcode:
hast, so musst Du im Quelltext bei der
http://localhost:8080/NameDeinerWebanwendung/Images?Image=Delbor_8.jpg
Delphi-Quellcode:
nur
WebModule1WebActImagesAction
Delphi-Quellcode:
abfragen und bekommst den Wertes hinter dem Gleichheitszeichen geliefert, hier im Beispiel also für Image den Wert Delbor_8.jpg, und dieser Wert wird oben in der Formatanweisung in den Pfad zu den Dateien eingefügt.
Request.QueryFields.Values['WertVorDemGleichheitszeichen']
Funktioniert im Prinzip wie bei Ini-Dateien ... Damit musst Du nicht mehr in einer endlosen If-Kaskade für jedes Bild eine extra Abfrage mache. Die folgende Routine sollte also für alle JPeg-Dateien funktionieren, die über eine Url der Form
Delphi-Quellcode:
vom Browser bei Deinem Programm angefordert werden.
http://localhost:8080/NameDeinerWebanwendung/Images?Image=irgendeindateiname.Endung
Delphi-Quellcode:
// PathInfo: /Images
procedure TWebModule1.WebModule1WebActImagesAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Var fs : tFileStream; sFile : String; begin Try // Die Pfadangabe sollte natürlich konfigurierbar sein. // Relative Pfade könnten auch möglich sein. // Dann gilt aber: Relativ ausgehend von der Webserver.Exe. sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\%s', [Request.QueryFields.Values['Image']]); fs := tFileStream.Create(sFile,fmOpenRead); Try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; Except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; End; Finally fs.Free; End; Handled := True; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 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