Autor Téma: Root adresář  (Přečteno 452 krát)

Offline lubomir.senkyrik

  • Nováček
  • *
  • Příspěvků: 4
  • Karma: 0
    • Verze Delphi: Delphi 10.2
Root adresář
« kdy: 24-11-2021, 08:57:12 »
Zdravím všechny,
pokouším se psát webové stránky přes WebBroker. Ve WebModule mám komponentu PageProducer, která odkazuje (absolutně) na HTML soubor (Index.htm). Při testování volám z prohližeče 'localhost:8080'. Stránka se mi zobrazí, ale grafické prvky PNG (jsou adresovány relativně) nikoliv.

Jaký je "Root" adresář serverové aplikace, nebo kde se definuje?

Dík.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Root adresář
« Odpověď #1 kdy: 24-11-2021, 09:34:47 »
Pokud to mas jako webmodule tak jsem to resil tak, ze v action jsem obslouzil sam (ale to jsem obrazky generoval), mozna to jde jinak

takovy nastin

Kód: Delphi [Vybrat]
  1.  
  2. function sLocalFile(const sName: string): string;
  3. begin
  4.   Result := ExtractFilePath(ParamStr(0)) '\' sName;
  5. end;
  6.  
  7. procedure TWebModule2.WebModule2designHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse;
  8.   var Handled: Boolean);
  9. begin
  10.   try
  11.  //  sFile ziskas z Request.PathInfo nebo podobne a namapujes si ho napr. sLocalFile(Request.PathInfo)
  12. // pokud je to png nebo co chces jineho, tak nastavis Handled := True;
  13.     oFileStream :=TFileStream.Create(sFile, fmOpenRead);
  14.     try
  15.       Response.ContentType := 'image/png';
  16.       Response.ContentStream := oFileStream;
  17.     finally
  18.       //oFileStream.Free;
  19.     end;
  20.   except
  21.     on e: Exception do
  22.     begin
  23.       Response.Content := Format('<html><heading/><body>Error:%s</body></html>', [e.Message]);
  24.       Response.StatusCode :=  500;//500 Internal Server Error
  25.     end;
  26.   end;
  27. end;
  28.  
  29.  

« Poslední změna: 24-11-2021, 09:40:33 od Radek Červinka »
Embarcadero MVP - Czech republic

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 238
  • Karma: 9
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Root adresář
« Odpověď #2 kdy: 24-11-2021, 10:21:01 »
Kde je root záleží na serveru. Já mám CGI aplikace na Apache ve složce c:\Apache24\cgi-bin\, ale root je ve složce c:\Apache24\htdocs\ .
V html mám odkaz na obrázek takto:
<img src="/img/cz.png" alt="CZ">
Obrázek české vlaječky mám tady:
c:\Apache24\htdocs\img\cz.png
Win10 Prof 64b, Firebird 2.5

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Root adresář
« Odpověď #3 kdy: 24-11-2021, 10:31:56 »
Jo, v tvem pripade to zaridi Apache, pokud to mas jako Indy web server tak to musis zaridit sam.
Embarcadero MVP - Czech republic

Offline lubomir.senkyrik

  • Nováček
  • *
  • Příspěvků: 4
  • Karma: 0
    • Verze Delphi: Delphi 10.2
Re:Root adresář
« Odpověď #4 kdy: 28-11-2021, 16:53:00 »
Pánové,
díky Vám jsem se posunul o dost dále. Sice se mi obrázky i nadále nezobrazují, ale musí to být v nějaké properties. Bázová adresa se dá zjistit odkud je server (aplikace) spouštěn. Pod tímto adresářem je podadresář /HTML a pod ním je ještě /PNG. Root adresář je skutečně adresář, kde jsou *.htm soubory a od ní se vše odvozuje.

Pokud zadám do prohlížeče adresu kde leží *.htm (C:/App/Billiard_FM/Bin/HTML/Index.htm), tak se mi vše korektně zobrazuje. Samozřejmě nejsou funkční události v serverovské aplikaci, ale všechny události v rámci *.htm probíhají zcela korektně a odkazy na další *.htm též.

Pokud zadám do prohlížeče localhost:8080, tak všechny relativní adresy se chovají jako neviditelné, ale asi je to jen můj dojem. Když jsem totiž v modulu TWebModule.Create otevřel libovolný soubor PNG, tak při otevírání stránek mi server vyvolal vyjímku, že tento soubor PNG nelze otevřít, poněvadž je již otevřen. To znamená, že HTML stránka mi správně otvírá soubor, ale z nějakého důvodu ho nezobrazuje. Proč, tak to nechápu.

Udělal jsem si úplně jednoduchý pokus s absolutním adresováním:

  Response.Content := '<html>' +
                        '<head>' +
                          '<title>Ahoj</title>' +
                        '</head>' +

                        '<body>' +
                        'Ahoj obrázku: <img id="Obrazek" src="C:/App/Billiard_FM/Bin/HTML/PNG/No.png" width="204" height="454" alt="Dom" />' +
                        '</body>' +
                      '</html>';

Výsledek: příloha..., opět se obrázek nezobrazí.

Zkoušel jsem to na platformách W32, W64 s komponentami VCL ale i s FM (FireMonkey). Stále stejné chování.

Máte ještě nějaký nápad?

Dík.


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Root adresář
« Odpověď #5 kdy: 28-11-2021, 18:55:58 »
No a pouzivas Apache, ISS nebo ciste webbroker? To jsem se jeste nedozvedel. A evidentne jsi necetl to co jsem napsal.
Embarcadero MVP - Czech republic

Offline lubomir.senkyrik

  • Nováček
  • *
  • Příspěvků: 4
  • Karma: 0
    • Verze Delphi: Delphi 10.2
Re:Root adresář
« Odpověď #6 kdy: 28-11-2021, 20:34:46 »
Používám WebBroker. A zkusil jsem tvé doporučení. Výsledek se nedostavil. Proč to nevím !!!!!


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Root adresář
« Odpověď #7 kdy: 28-11-2021, 21:04:50 »
v tom  src="C:/App/Billiard_FM/Bin/HTML/PNG/No.png" ma byt  napr. src="/PNG/No.png" a toto ti prijde v tom co jsem psal a nasledne pro to vratis PNG z disku z C:/App/Billiard_FM/Bin/HTML/PNG/No.png . Uz nevim jak ti to mam jinak napsat.
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Root adresář
« Odpověď #8 kdy: 30-11-2021, 08:19:42 »
V priloze demo. v adresari win32/debug je adresar img. Cely program je

Kód: Delphi [Vybrat]
  1. procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  2.   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  3. var
  4.   oFS: TFileStream;
  5. begin
  6.   if ExtractFileExt(Request.PathInfo) = '.png' then
  7.   begin
  8.     oFS := TFileStream.Create(ExtractFilePath(ParamStr(0)) + StringReplace(Request.PathInfo, '/','\', [rfReplaceAll]), fmOpenRead);
  9.     Response.ContentStream := oFS;
  10.     Response.ContentType := 'image/png';
  11.   end
  12.   else
  13.   Response.Content :=
  14.     '<html>' +
  15.     '<head><title>Web Server Application</title></head>' +
  16.     '<body>Web Server Application - path:'+Request.PathInfo+'</body>' +
  17.     '</html>';
  18. end;
  19.  

Pro overeni: http://localhost:8080/img/forum.png zobrazi png, cokoliv jineho jde tou druhou vetvi

Tj. pokud budes mit v html nejaky png referencovany jako /img/neco.png tak by to melo zafungovat.
Embarcadero MVP - Czech republic