Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Das System kann den Pfad nicht finden (https://www.delphipraxis.net/189649-das-system-kann-den-pfad-nicht-finden.html)

Delbor 5. Jul 2016 11:17

Das System kann den Pfad nicht finden
 
Hi zusammen
Da dieses Thema nicht mehr ganz so zum Thema dieses Threads passt, mache ich einen neuen auf.
Aktueller Stand der Dinge ist: Ich habe 2 WebactionItems, in denen ich jeweils versuche, einen Hintergrund, bzw. ein Logo zu laden:

Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActBackgroundItem2Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var  fs : tFileStream; sFile, BGdPath : String;
begin
  if Request.PathInfo = '/Images/background/bgblue.jpg' then
  begin
    try
//                     E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background
      sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background\%s', [Request.QueryFields.Values['background']]);

      fs := tFileStream.Create(sFile,fmOpenRead);
...
und
Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActLogoitemAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var  fs : tFileStream; sFile, BGdPath : String;
begin
  try
//                   E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo
    sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo\%s', [Request.QueryFields.Values['Logo']]);

    fs := tFileStream.Create(sFile,fmOpenRead);
Beide Male wird mir eine Exception geworfen - die Fehlermeldung besagt in etwa das, was der Threadtitel aussagt.
In beiden Codeschnipseln steht über der Format-Anweisung jeweils der Pfad, wie er im Explorer in der Adresszele steht - der kann daher eigentlich gar nicht falsch sein.
Soeben versucht habe ich:
Delphi-Quellcode:
sFile := Format('\Images\Logo\%s', [Request.QueryFields.Values['Logo']]);
Das hätte eigentlich funktionieren sollen (unterhalb des Html-Ordners liegt noch einOrdner 'Logo' mit dem gesuchten Inhalt). Das Resultat war jedoch dasselbe...
Was läuft da falsch?

Gruss
Delbor

rapante 5. Jul 2016 11:21

AW: Das System kann den Pfad nicht finden
 
Mal so aus der Hüfte: Müsste man die Backslashes nicht escapen? Also: "C:\\testordener\\datei.jpg"

p80286 5. Jul 2016 11:29

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von Delbor (Beitrag 1341977)
Beide Male wird mir eine Exception geworfen - die Fehlermeldung besagt in etwa das, was der Threadtitel aussagt.

"In etwa" ist ja sehr dehnbar.
a) nimm die Meldung wörtlich, ist der Pfad wirklich vorhanden? was wird an das Stream.Create wirklich übergeben?
b) Dir (deinem Programm)fehlt die notwendige Berechtigung die Datei zu öffnen.
c) Die Datei ist schon geöffnet (und sei es durch ein ProgrammZombie)

Gruß
K-H

Sir Rufo 5. Jul 2016 11:37

AW: Das System kann den Pfad nicht finden
 
@p80286

Um zu ermitteln was in
Delphi-Quellcode:
sfile
steht wenn der Stream erzeugt wird müsste man ja so etwas wie einen Debugger haben und den auch noch verwenden und dann auch noch lesen.

Das sind ja drei Dinge auf einmal ... und das gibt es doch nur beim Ü-Ei

Ich hätte eigentlich erwartet, dass man auf diese Idee auch von selber kommt und diese Erkenntnis gleich mit in die Frage packt ... obwohl, welche Frage gibt es dann noch?

Delbor 5. Jul 2016 11:39

AW: Das System kann den Pfad nicht finden
 
Hi zusammen

@rapante:
Wäre wohl zu testen. Andrerseits enthält request.pathinfo nur einzelne Slashes (noch nicht mal Backslashes). Und mein kluges Buch weiss auch nichts davon...
@ p80286:
'In etwa': Ich habe das Wörtchen 'angegebenen' ausgelassen.
a) Ja, der Pfad ist vorhanden
b) Wenig wahrscheinlich, aber wäre zu prüfen
c) Da bliebe wohl nur ein neustart...

Gruss
Delbor

Sir Rufo 5. Jul 2016 11:44

AW: Das System kann den Pfad nicht finden
 
Es ist anscheinend sehr schwer :roll:

Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActBackgroundItem2Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var fs : tFileStream; sFile, BGdPath : String;
begin
  if Request.PathInfo = '/Images/background/bgblue.jpg' then
  begin
    try
// E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background
      sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background\%s', [Request.QueryFields.Values['background']]);

      /// !!! AUFMERKSAMKEIT !!!!
      /// Was steht JETZT in der Variablen sfile?
      /// !!! AUFMERKSAMKEIT !!!!

      fs := tFileStream.Create(sFile,fmOpenRead);
...
So besser zu verstehen?

MrSpock 5. Jul 2016 11:48

AW: Das System kann den Pfad nicht finden
 
Kann es an dem Leerzeichen im Pfadnamen liegen?

Sir Rufo 5. Jul 2016 11:54

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von MrSpock (Beitrag 1341986)
Kann es an dem Leerzeichen im Pfadnamen liegen?

Das wäre nur dann zu beachten, wenn man den Pfad als Kommandozeilen-Parameter übergibt ... sonst ist es wurscht ... bzw. genau richtig so, wenn der Pfad auch exakt so lautet ;)

PS: Ich vermute mal, dass in
Delphi-Quellcode:
sfile
folgender Inhalt zu finden ist
Zitat:

E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\Delbo rDataSnapServer\Images\background\

Delbor 5. Jul 2016 12:01

AW: Das System kann den Pfad nicht finden
 
Hi Sir Rufo

Nachdem ich deinen Beitrag (#4) gelesen hatte, holte ich das mal nach - da steht der Pfad so drin, wie ich ihn aus dem Explorer kopiert habe.
(Den auskommentierten). Also ohne Dateiangabe. Und wenn ich das richtig verstanden habe, sollte in
Delphi-Quellcode:
[Request.QueryFields.Values['background']
folgendes stehen.
Delphi-Quellcode:
'background=bgblue.jpg'
, respektive eine Liste mit Namen/Werte-Paaren, wenn da mehr als eine Datei vorhanden ist.

Gruss
Delbor
PS:
Zitat:

PS: Ich vermute mal, dass in sfile folgender Inhalt zu finden ist
So ist es...

Sir Rufo 5. Jul 2016 12:07

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von Delbor (Beitrag 1341990)
PS:
Zitat:

PS: Ich vermute mal, dass in sfile folgender Inhalt zu finden ist
So ist es...

Na, dann hast du den Fehler doch schon gefunden ... dann kannst du ja weiter machen

nahpets 5. Jul 2016 12:29

AW: Das System kann den Pfad nicht finden
 
Im Request steht nicht
Delphi-Quellcode:
background=bgblue.jpg
.
Sondern über die Abfrage von
Delphi-Quellcode:
[Request.QueryFields.Values['background']
sollte man
Delphi-Quellcode:
bgblue.jpg
erhalten.

Mit Values fragt man den Wert vor einem Gleichheitszeichen in der URL ab, um den Wert hinter dem Gleichheitszeichen zu bekommen.

Also erhält man mit
Delphi-Quellcode:
sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background\%s', [Request.QueryFields.Values['background']]);
hier in sFile
Delphi-Quellcode:
E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background\bgblue.jpg
Das sollte man mal überprüfen und ebenfalls sollte man prüfen, ob es exakt diese Datei auch gibt.

Sir Rufo 5. Jul 2016 12:45

AW: Das System kann den Pfad nicht finden
 
Also, der Sachverhalt stellt sich mir wie folgt dar:

Es erfolgt ein Request vom Browser mit dieser URL
Code:
http://localhost:8080/Images/background/bgblue.jpg
Somit stellt sich folgende Denksportaufgabe:
Zitat:

Nenne alle QueryFields in diesem Request mit den dazugehörigen Werten!

Delbor 5. Jul 2016 12:50

AW: Das System kann den Pfad nicht finden
 
Hi Sir Rufo

Das hat dann doch noch etwas gedauert - der Pfad zeigte auf einen Ordner 'Images' in der selben Ebene wie 'html'. Das hab ich nun geändert. Vorerst mit dem selben Erfolg. Dann ist mir folgendes aufgefallen:
Delphi-Quellcode:
...\background\%s', [Request.QueryFields.Values['background']]);
In den eckigen Klammern müsste der Dateiname stehen...

Delphi-Quellcode:
sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\html\Images\Logo\%s', [Request.QueryFields.Values['Delbor_9_5.jpg']]);
Das scheint Delphi egal zu sein. In sFile steht der Pfad immer noch ohne Dateiname...

Gruss
Delbor

Sir Rufo 5. Jul 2016 12:52

AW: Das System kann den Pfad nicht finden
 
@Delbor

Löse die Denksportaufgabe in http://www.delphipraxis.net/1341997-post12.html und du bist einen Schritt weiter

p80286 5. Jul 2016 12:59

AW: Das System kann den Pfad nicht finden
 
Damit das Debuggen etwas einfacher ist:
Delphi-Quellcode:
...
 irgendeiner:=Request.QueryFields.Values['background'];
 sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background\%s', [irgendeiner]);
...

Gruß
K-H

nahpets 5. Jul 2016 13:02

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von Delbor (Beitrag 1341998)
Hi Sir Rufo

Das hat dann doch noch etwas gedauert - der Pfad zeigte auf einen Ordner 'Images' in der selben Ebene wie 'html'. Das hab ich nun geändert. Vorerst mit dem selben Erfolg. Dann ist mir folgendes aufgefallen:
Delphi-Quellcode:
...\background\%s', [Request.QueryFields.Values['background']]);
In den eckigen Klammern müsste der Dateiname stehen...

Delphi-Quellcode:
sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\html\Images\Logo\%s', [Request.QueryFields.Values['Delbor_9_5.jpg']]);
Das scheint Delphi egal zu sein. In sFile steht der Pfad immer noch ohne Dateiname...

Gruss
Delbor

Und wie sieht jetzt nun die URL zu diesem konkreten Beispiel aus?

Bitte einmal alle Informationen, sonst gibt das nie was!

Für die Nutzung von Request muss die Url in etwa so aussehen:
Delphi-Quellcode:
http://localhost:8080/NameDeinerWebanwendung/Images?Image=Delbor_8.jpg
Ist dem so?

Mit der Abfrage des Dateinamens bei Value, wirst Du diesen nur bekommen, wenn die URL so aussieht:
Delphi-Quellcode:
http://localhost:8080/NameDeinerWebanwendung/Images?Delbor_9_5.jpg=Delbor_8.jpg
Also nochmal: Im Quelltext steh immer:
Delphi-Quellcode:
Request.QueryFields.Values['Images']
Und als Ergebnis bekommt man den Wert aus der Url der hinter
Delphi-Quellcode:
Image=
steht.

Mit einer URL der Form
Delphi-Quellcode:
http://localhost:8080/Images/background/bgblue.jpg
wird das nie funktionieren, da hier keine Wertepaare für die Abfrage über Request.QueryFields.Values enthalten sind.

Sir Rufo 5. Jul 2016 13:05

AW: Das System kann den Pfad nicht finden
 
@nahpets

Welchen Request würdest du erwarten, wenn du im Source
Delphi-Quellcode:
if Request.PathInfo = '/Images/background/bgblue.jpg' then
findest? :stupid:

Damit das funktioniert müsste der Request so aussehen
Code:
http://localhost:8080/Images/background/bgblue.jpg?background=bgblue.jpg
um dann per
Delphi-Quellcode:
Request.QueryFields.Values['background']
den Wert
Delphi-Quellcode:
'bgblue.jpg'
zu erhalten.

Aber wer macht schon so einen doppelt gemoppelten Unfug? :stupid:

nahpets 5. Jul 2016 13:22

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von Sir Rufo (Beitrag 1342004)
@nahpets

Welchen Request würdest du erwarten, wenn du im Source
Delphi-Quellcode:
if Request.PathInfo = '/Images/background/bgblue.jpg' then
findest? :stupid:

Damit das funktioniert müsste der Request so aussehen
Code:
http://localhost:8080/Images/background/bgblue.jpg?background=bgblue.jpg
um dann per
Delphi-Quellcode:
Request.QueryFields.Values['background']
den Wert
Delphi-Quellcode:
'bgblue.jpg'
zu erhalten.

Aber wer macht schon so einen doppelt gemoppelten Unfug? :stupid:

Ich nicht!

Pathinfo ist nicht '/Images/background/bgblue.jpg', das wäre eine konkrete Abfrage für eine Datei.

Pathinfo wäre in meinem Beispiel /Images.

Alles was hinter dem Fragezeichen kommt, also die durch Gleichheitszeichen getrennten und per Ampersand aufgezählten Wertepaare, sind im Request über QueryFields (als Stringliste) abzufragen.

Die Benutzung von absoluten und relativen Pfadangaben in der URL schließen die Nutzung von Request.QueryFields aus. Entweder den einen oder den anderen Weg, aber nicht irgendsoeinen unfundierten Mischmasch.

Wenn wir aber mal von einer PathInfo
Delphi-Quellcode:
if Request.PathInfo = '/Images/background/bgblue.jpg'
ausgehen, so müsste, um mit Request.QueryFields arbeiten zu können, die Url in etwa so aussehen:
Delphi-Quellcode:
http://localhost:8080/Images/background/bgblue.jpg?Images=Bildername.jpg'
Und das wäre nach meiner Meinung absoluter Humbug.

Sir Rufo 5. Jul 2016 13:29

AW: Das System kann den Pfad nicht finden
 
@nahpets

Genau das ist doch der springende Punkt.

Die aufgerufene URL ist
Code:
http://localhost:8080/Images/background/bgblue.jpg
Es gibt dort keine QueryFields die man abfragen könnte. Jede Abfrage über egal welches Feld liefert einen leeren String zurück, denn es gibt eben keine Felder die irgendeinen Inhalt haben. Also können wir diese Felder getrost beiseite legen und einfach nicht mehr drüber sprechen, weil einfach nur müßig.

Die PathInfo ist aber in diesem Fall
Delphi-Quellcode:
'/Images/background/bgblue.jpg'
.

Also muss man einfach nur mit dieser PathInfo zurechtkommen, denn mehr ist einfach nicht da.

nahpets 5. Jul 2016 13:56

AW: Das System kann den Pfad nicht finden
 
@Sir RUfo
Bei '/Images/background/bgblue.jpg' handelt es sich um eine von Dir ins Spiel gebrachte PathInfo, für die ich nicht feststellen konnte, dass sie beim konkreten Problem zur Anwendung kommt.

Im anderen Thread hatte ich beschrieben, wie eine URL aufgebaut werden muss, damit die Abfrage über Request.QueryFields funktioniert. Wenn man sich nicht daran hält, dann geht's halt nicht.

Mit der von Dir vorgeschlagenen PathInfo muss man dann aber in der Web-Applikation über If-Kaskaden wieder jede Url abfragen. Wer macht denn sowas?
Dann müsste man ja für jedes neue Bild in 'ner Webseite auch die Web-Applikation anpassen.

Delphi-Quellcode:
http://localhost:8080/Images/background/bgblue.jpg?background=bgblue.jpg
Ist so natürlich Unsinn.

Ohne Nutzung von Request.QueryFields so:
Delphi-Quellcode:
http://localhost:8080/Images/background/bgblue.jpg

Mit Nutzung von Request.QueryFields so:
Delphi-Quellcode:
http://localhost:8080/Images?background=bgblue.jpg

Alles Andere halte ich für nicht zielführend.

Hier mal 'ne Testroutine (aus 'ner mit Delphi 7 geschriebenen ISAPI-DLL'), um sich die Inhalte des Request im Browser ansehen zu können:
Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
Var
          Page   : TStringList;
begin
  Page := tStringList.Create;
  Try
    Page.Add('<html>');
    Page.Add('<head>');
    Page.Add('<title>');
    Page.Add('Testseite');
    Page.Add('</title>');
    Page.Add('</head>');
    Page.Add('<body>');
    Page.Add('<hr />');
    Page.Add('Request-Info<br /><br />');
    Page.Add('Request.Accept: ' + Request.Accept + '<br />');
    Page.Add('Request.Authorization: ' + Request.Authorization + '<br />');
    Page.Add('Request.CacheControl: ' + Request.CacheControl + '<br />');
    Page.Add('Request.Connection: ' + Request.Connection + '<br />');
    Page.Add('Request.Content: ' + Request.Content + '<br />');
    Page.Add('Request.ContentEncoding: ' + Request.ContentEncoding + '<br />');
    Page.Add('Request.ContentFields.Text: ' + Request.ContentFields.Text + '<br />');
    Page.Add('Request.ContentLength: ' + IntToStr(Request.ContentLength) + '<br />');
    Page.Add('Request.ContentType: ' + Request.ContentType + '<br />');
    Page.Add('Request.ContentVersion: ' + Request.ContentVersion + '<br />');
    Page.Add('Request.Cookie: ' + Request.Cookie + '<br />');
    Page.Add('Request.CookieFields.Text: ' + Request.CookieFields.Text + '<br />');
    Page.Add('Request.Date: ' + DateToStr(Request.Date) + '<br />');
    Page.Add('Request.DerivedFrom: ' + Request.DerivedFrom + '<br />');
    Page.Add('Request.Expires: ' + DateToStr(Request.Expires) + '<br />');
    Page.Add('Request.From: ' + Request.From + '<br />');
    Page.Add('Request.Host: ' + Request.Host + '<br />');
    Page.Add('Request.IfModifiedSince: ' + DateToStr(Request.IfModifiedSince) + '<br />');
    Page.Add('Request.InternalPathInfo: ' + Request.InternalPathInfo + '<br />');
    Page.Add('Request.InternalScriptName: ' + Request.InternalScriptName + '<br />');
    Page.Add('Request.Method: ' + Request.Method + '<br />');
    Page.Add('Request.PathInfo: ' + Request.PathInfo + '<br />');
    Page.Add('Request.PathTranslated: ' + Request.PathTranslated + '<br />');
    Page.Add('Request.ProtocolVersion: ' + Request.ProtocolVersion + '<br />');
    Page.Add('Request.Query: ' + Request.Query + '<br />');
    Page.Add('Request.QueryFields.Text: ' + Request.QueryFields.Text + '<br />');
    Page.Add('Request.Referer: ' + Request.Referer + '<br />');
    Page.Add('Request.RemoteAddr:' + Request.RemoteAddr + '<br />');
    Page.Add('Request.RemoteHost: ' + Request.RemoteHost + '<br />');
    Page.Add('Request.ScriptName: ' + Request.ScriptName + '<br />');
    Page.Add('Request.ServerPort: ' + IntToStr(Request.ServerPort) + '<br />');
    Page.Add('Request.URL: ' + Request.URL + '<br />');
    Page.Add('Request.UserAgent: ' + Request.UserAgent + '<br />');
    Page.Add('<hr>');
    Page.Add('</body>');
    Page.Add('</html>');
    Page.Add('');
    Page.Add('');
    Response.Content := Page.Text;
    Response.SendResponse;
  Finally
    Page.Free;
  End;
  Handled := True;
end;

Sir Rufo 5. Jul 2016 14:04

AW: Das System kann den Pfad nicht finden
 
@nahpets

Da der erste Beitrag wohl schon zu lange zurück liegt, hier einmal der Beitrag als Komplett-Quote:

Bitte achte auf die 5. Zeile im ersten Quelltext-Abschnitt. Das stammt nicht von mir, sondern (steht da im Zitat-Block) und kann von jedermann im ersten Beitrag dieses Threads nachgelesen werden.
Zitat:

Zitat von Delbor (Beitrag 1341977)
Hi zusammen
Da dieses Thema nicht mehr ganz so zum Thema dieses Threads passt, mache ich einen neuen auf.
Aktueller Stand der Dinge ist: Ich habe 2 WebactionItems, in denen ich jeweils versuche, einen Hintergrund, bzw. ein Logo zu laden:

Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActBackgroundItem2Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var  fs : tFileStream; sFile, BGdPath : String;
begin
  if Request.PathInfo = '/Images/background/bgblue.jpg' then
  begin
    try
//                     E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background
      sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background\%s', [Request.QueryFields.Values['background']]);

      fs := tFileStream.Create(sFile,fmOpenRead);
...
und
Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActLogoitemAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var  fs : tFileStream; sFile, BGdPath : String;
begin
  try
//                   E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo
    sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo\%s', [Request.QueryFields.Values['Logo']]);

    fs := tFileStream.Create(sFile,fmOpenRead);
Beide Male wird mir eine Exception geworfen - die Fehlermeldung besagt in etwa das, was der Threadtitel aussagt.
In beiden Codeschnipseln steht über der Format-Anweisung jeweils der Pfad, wie er im Explorer in der Adresszele steht - der kann daher eigentlich gar nicht falsch sein.
Soeben versucht habe ich:
Delphi-Quellcode:
sFile := Format('\Images\Logo\%s', [Request.QueryFields.Values['Logo']]);
Das hätte eigentlich funktionieren sollen (unterhalb des Html-Ordners liegt noch einOrdner 'Logo' mit dem gesuchten Inhalt). Das Resultat war jedoch dasselbe...
Was läuft da falsch?

Gruss
Delbor


Delbor 5. Jul 2016 14:10

AW: Das System kann den Pfad nicht finden
 
Hi zusammen

Wieso fällt mir erst jetzt auf, dass hier immer von einer URL die Rede ist?
Der Inhalt von Request.PathInfo stammt aus dieser HTML-Anweisung im Hauptdokument:
Delphi-Quellcode:
  <div id="Titellogo">&nbsp;,&nbsp;                    <!--<div  id="imglogo">&nbsp;-->
     <!--<div id="img1">&nbsp;<img alt="DelborPunktCH" src="./Images/jpeg150/DSC_5751.jpg"/></div>-->
    <h2>Willkommen auf den Seiten von</h2>
    <img src ="Images/Logo/Delbor_8.jpg" alt="Losggosrc=" /> //Genau genommen hier

  </div>
Also nix mit URL.

So, wie ich das bisher verstanden habe, ist der Wert von Request.Pathinfo beim ersten Eintreffen der Anfrage '/'. Die Antwort ist [DELPHI]
Delphi-Quellcode:
Response.Content := PageproducerHome.Content
Und der ist erstmal das komplette HTML der Seite.
Anschliessend liest der Browser den HTML-Text, und wenn er auf bestimmte Tags stösst wie <img>, setzt er nochmal einen Request ab, um das Bild zu erhalten.
Und das ganze wiederholt der Browser solange, bis er alle Infos hat, Erst jetzt wrd die Verbindung geschlossen. Soweit richtig?

Also enthält Request.Pathinfo offenbar nie eine URL.
Wenn, dann müsste die URL in Request.URL enthalten sein. Wobei ich mich frage, ob in einer auf localhost laufenden Anwendung überhaupt eine URL ausgegeben wird (die es aber natürlich gibt).

Gruss
Delbor

Sir Rufo 5. Jul 2016 14:17

AW: Das System kann den Pfad nicht finden
 
Ok, ich geb hier dann mal auf ...

Als Lektüre sei empfohlen
https://wiki.selfhtml.org/wiki/HTML/...fiken/Grafiken
sowie https://wiki.selfhtml.org/wiki/HTML/...zieren_in_HTML (dieser Link findet sich auch im ersten Link)

nahpets 5. Jul 2016 14:40

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von Sir Rufo (Beitrag 1342011)
@nahpets

Da der erste Beitrag wohl schon zu lange zurück liegt, hier einmal der Beitrag als Komplett-Quote:

Bitte achte auf die 5. Zeile im ersten Quelltext-Abschnitt. Das stammt nicht von mir, sondern (steht da im Zitat-Block) und kann von jedermann im ersten Beitrag dieses Threads nachgelesen werden.
Zitat:

Zitat von Delbor (Beitrag 1341977)
Hi zusammen
Da dieses Thema nicht mehr ganz so zum Thema dieses Threads passt, mache ich einen neuen auf.
Aktueller Stand der Dinge ist: Ich habe 2 WebactionItems, in denen ich jeweils versuche, einen Hintergrund, bzw. ein Logo zu laden:

Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActBackgroundItem2Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var  fs : tFileStream; sFile, BGdPath : String;
begin
  if Request.PathInfo = '/Images/background/bgblue.jpg' then
  begin
    try
//                     E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background
      sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\background\%s', [Request.QueryFields.Values['background']]);

      fs := tFileStream.Create(sFile,fmOpenRead);
...
und
Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActLogoitemAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var  fs : tFileStream; sFile, BGdPath : String;
begin
  try
//                   E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo
    sFile := Format('E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo\%s', [Request.QueryFields.Values['Logo']]);

    fs := tFileStream.Create(sFile,fmOpenRead);
Beide Male wird mir eine Exception geworfen - die Fehlermeldung besagt in etwa das, was der Threadtitel aussagt.
In beiden Codeschnipseln steht über der Format-Anweisung jeweils der Pfad, wie er im Explorer in der Adresszele steht - der kann daher eigentlich gar nicht falsch sein.
Soeben versucht habe ich:
Delphi-Quellcode:
sFile := Format('\Images\Logo\%s', [Request.QueryFields.Values['Logo']]);
Das hätte eigentlich funktionieren sollen (unterhalb des Html-Ordners liegt noch einOrdner 'Logo' mit dem gesuchten Inhalt). Das Resultat war jedoch dasselbe...
Was läuft da falsch?

Gruss
Delbor


Sorry, aber die 5. Zeile ist inhaltlich Blödsinn, das ist keine Pathinfo, wie sie in einer Web-Applikation genutzt wird. Da wird ein konkreter Dateiname abgefragt.

Und wenn in 'ner Webseite irgendwo eine IMG-Tag steht, dann baut der Browser daraus eine URL zusammen, mit der er beim Webserver anfragt, ob er den Inhalt bekommen kann.

Wenn in der HTML-Datei irgendwo sowas steht:
Code:
<img alt="DelborPunktCH" src="./Images/jpeg150/DSC_5751.jpg"/>
dann ist das keine Pathinfo, sondern ein relativer Pfad zu einer angeforderten Datei.

Diese Datei sollte dann vom Webserver aus gesehen im Unterverzeichnis Images und dann im darunterliegenden Verzeichnis jpeg150 liegen. Dafür ist die Nutzung der PathInfo irrelevant.

Nehmen wir mal eine Web-Anwendung, die irgendwo in der Welt liegt und die mit einer ISAPI-DlL arbeitet:

Die URL sei:
Code:
http://Servername.de/WebMenu.dll/Images?Image=Background.jpg
Der Webserver erfährt hier also, dass er die DLL WebMenu zu verwenden hat. Die DLL schaut nun, welche PathInfo sie verwenden soll. Dies wäre Images. In der Behandlungsroutine für die PathInfo Images kann nun über Request.QueryFields.Values['Image'] der Wert BackGround.jpg in Erfahrung gebracht werden.

In der von mir geposteten Routine könnte damit dann die Datei BackGround.jpg ausgeliefert werden.

In der HTML-Datei müsste das Tag dann so aussehen:
Code:
<img src="http://Servername.de/WebMenu.dll/Images?Image=Background.jpg">
Übertragen auf eine Web-Applikation wäre das vermutlich dann
Code:
<img src="http://localhost:8080/Images?Image=Background.jpg">
Bei 'ner WebApplikation sollte aber dashier auch gehen:
Code:
<img src="Images?Image=Background.jpg">
Bin mir momentan nicht sicher, ob es eventuell
Code:
<img src="/Images?Image=Background.jpg">
heißen muss.

Sir Rufo 5. Jul 2016 14:53

AW: Das System kann den Pfad nicht finden
 
@nahpets

Natürlich würde das so gehen, aber warum nicht einfach beim
Code:
<img src="/Images/background/bgblue.jpg"/>
belassen und dann ganz simpel den Pfad zusammenbauen mit
Delphi-Quellcode:
// Request.PathInfo => /Images/background/bgblue.jpg
sfile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDatasnapServer' + Request.PathInfo;
// sfile => E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDatasnapServer/Images/background/bgblue.jpg
fs := TfileStream.Create( sfile, fsOpenRead );
und der Drops ist gelutscht ...

Zu geradeaus? Zu einfach?

Delbor 5. Jul 2016 15:43

AW: Das System kann den Pfad nicht finden
 
Hi zusammen

Sir Rufos Vorschlag scheint mir wirklich plausibel. Der einzige "Wermutstropfen" dabei ist, dass es sich dabei um einen hartcodierten vollständigen Pfad handelt. Der würde natürlich nicht mehr funktionieren, wenn die Anwendung später auf meinem gemieteten Webspace laufen soll.
Das Rootverzeichnis meines Webspaces ist "/". Darüber hinaus habe ich keinen Zugriff/ist kein Zugriff erlaubt.
Das heisst: die Anwendng muss auf meinem Webspace zwingend unter diesem Verzeichnis liegen. Und wenn ich das richtig verstehe und interpretiere, müsste die Anwendung zur Entwicklungszeit unterhalb des html-Verzeichnisses liegen, was zur Zeit nicht der Fall ist. Damit könnten sich dann alle Pfade relativ zum HTML-Verzeichnis oder eben "/" beziehen.

Gruss
Delbor

Sir Rufo 5. Jul 2016 15:53

AW: Das System kann den Pfad nicht finden
 
Das ist natürlich fatal. Es müsste so etwas wie Konfigurations-Datei geben, wo man diese Information ablegen könnte, und dann evtl. noch so etwas wie eine Variable, wo man den Wert aus der Konfigurations-Datei einmal ausliest sich dort merkt und dann immer verwendet.

Aber leider gibt es so etwas bestimmt nicht ... es könnte ja so schön sein ... :roll:

Jumpy 5. Jul 2016 15:57

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von Delbor (Beitrag 1342025)
Hi zusammen

Sir Rufos Vorschlag scheint mir wirklich plausibel. Der einzige "Wermutstropfen" dabei ist, dass es sich dabei um einen hartcodierten vollständigen Pfad handelt. Der würde natürlich nicht mehr funktionieren, wenn die Anwendung später auf meinem gemieteten Webspace laufen soll.
Das Rootverzeichnis meines Webspaces ist "/". Darüber hinaus habe ich keinen Zugriff/ist kein Zugriff erlaubt.
Das heisst: die Anwendng muss auf meinem Webspace zwingend unter diesem Verzeichnis liegen. Und wenn ich das richtig verstehe und interpretiere, müsste die Anwendung zur Entwicklungszeit unterhalb des html-Verzeichnisses liegen, was zur Zeit nicht der Fall ist. Damit könnten sich dann alle Pfade relativ zum HTML-Verzeichnis oder eben "/" beziehen.

Gruss
Delbor

Du hast einen / planst für einen gemieteten Webspace. Was darf den da laufen? Deine Datesnap-Server-Exe? Sowas geht?

DeddyH 5. Jul 2016 16:03

AW: Das System kann den Pfad nicht finden
 
@Delbor
Mal ganz ehrlich: in der langen Zeit, in der Du Dich mit diesem Webgedöns schon herumschlägst (ich verfolge das ja nun schon eine ganze Weile, sowohl hier als auch im Delphi-Treff), hättest Du Dich mit einem der zahllosen (auch kostenfreien) CMS beschäftigen können, die bereits sehr ausgereift sind und ständig weiterentwickelt werden. Damit wärst Du wahrscheinlich schon um Lichtjahre weiter mit Deinem Projekt.

Delbor 5. Jul 2016 16:59

AW: Das System kann den Pfad nicht finden
 
Hi zusammen
@Jumpy:
Zitat:

Du hast einen / planst für einen gemieteten Webspace. Was darf den da laufen? Deine Datesnap-Server-Exe? Sowas geht?
Nach telefonischer Auskunft des Hosters: ja. Auch eine Isapi.dll wäre möglich.

@DeddyH:
Zitat:

Mal ganz ehrlich: in der langen Zeit, in der Du Dich mit diesem Webgedöns schon herumschlägst (ich verfolge das ja nun schon eine ganze Weile, sowohl hier als auch im Delphi-Treff), hättest Du Dich mit einem der zahllosen (auch kostenfreien) CMS beschäftigen können, die bereits sehr ausgereift sind und ständig weiterentwickelt werden. Damit wärst Du wahrscheinlich schon um Lichtjahre weiter mit Deinem Projekt.
Das ist anzunehmen. Wobei - Teil meines Projektes ist ja meine Bilddatenbank, bzw. mein "Contentmaster". Und wie ich den mit zum Bleistift einer Typo3-Anwendung verbinde, um Inhalte einzupflegen, hab ich schlicht keine Ahnung.

Typo3 war längere Zeit meine Wahl. Wobei mir je länger je mehr unangenehm wurde, Aktualisierungen nur browserbasiert vornehmen zu können. Ausserdem das ganze durchwühlen der unzähligen Extensions und bis man herausgefunden hat, welche dieser Extensions.... Kurz und gut; ich glaube nicht wirklich, dass ich da sehr viel Zeit einsparen würde. Auch wenn selber Programmieren zum ersten mal zeitaufwändiger ist.
Dazu kommt, dass ich lieber etwas mehr in ein Projekt stecke, als nach dass ich nach einer gewissen Zeit feststelle, dass das gewählte Gratistool doch nicht so ganz meinen Wünschen entspricht.
Und natürlich kommt da auch noch eine gewisse Portion "Angefressenheit" dazu.

Diesen Faden könnte man jetzt noch unendlich weiterspinnen, bis hin zu der Frage:"Soll ich nicht doch....?" Andrerseits - wenn ich jedesmal, wenn etwas schwieriger zu werden droht, was neues beginne, komme ich nie irgendwohin...

Gruss
Delbor

Jumpy 5. Jul 2016 17:14

AW: Das System kann den Pfad nicht finden
 
Zitat:

Zitat von Delbor (Beitrag 1342031)
Hi zusammen
@Jumpy:
Zitat:

Du hast einen / planst für einen gemieteten Webspace. Was darf den da laufen? Deine Datesnap-Server-Exe? Sowas geht?
Nach telefonischer Auskunft des Hosters: ja. Auch eine Isapi.dll wäre möglich.

Ich würde an deiner Stelle (falls nicht schon gemacht) eine kleine Datasnape-Server-Exe oder eine Isapi.dll oder sonstwas erstellen (mit Delphi halt), die eine "Hello World"-Webseite zurückliefert.

Diese dann mal beim Host hochladen und testen, gewissermassen als proof of concept. Ich habe sonst nämlich die Befürchtung, dass du immer mehr Zeit hier investiert um das bei dir lokal ans laufen zu bekommen und nachher war alles für die Katz, weil es bei deinem Hoster nicht läuft.

Delbor 5. Jul 2016 17:16

AW: Das System kann den Pfad nicht finden
 
Hi Sir Rufo
Zitat:

Aber leider gibt es so etwas bestimmt nicht ... es könnte ja so schön sein ...
:-D:-D:-D

Das Thema WebConfig kommt sicher auch noch auf mich zu. Vorerst bin ich froh zufrieden, wenn ich dasschaffe, was mir in den letzten Versuchen nicht gelang:
  • Mehrere Seiten, auch unterschiedlichen Inhalts, anzeigen zu könnnen
  • Die IIS so zu konfigurieren, dass ich darunter eine ISAPI zum laufen bringe
  • Generell mehr Verständnis für Webprogrammierung erwerben kann
  • und...und...und

Auf jeden Fall euch allen recht vielen Dank für eure Geduld!!!

Gruss
Delbor

Delbor 5. Jul 2016 17:39

AW: Das System kann den Pfad nicht finden
 
Hi Jumpy
Zitat:

Diese dann mal beim Host hochladen und testen, gewissermassen als proof of concept.
Das ist eine sehr gute Idee. Das Ziel derzeit ist nicht eine komplette Datasnap-Anwendung. Sowas soll erst bei einem Weiterausbau hinzukommen.
Ich denke, sobald ich es geschafft habe, mehrere Seiten anzuzeigen, eine Sessionverwaltung und eine Userverwaltung einzubauen, kann ich mal versuchen, das Ding auf den Webspace zu bringen. Das ist so sicher mehr Aufwand, als wenn ich nur eine "Hello World"-Seite erstelle. Aber sei's drum! Auch ohne Userverwaltung wäre ich vorerst zufrieden - im Moment läuft meine Webseite unter einem vom Hoster entwickelten, eher einfachen Tool, so dass ich nach meinem Konzept relativ "schnell" fast genau das habe, was jetzt Sache ist.

Gruss
Delbor

himitsu 6. Jul 2016 17:50

AW: Das System kann den Pfad nicht finden
 
Nein, die Datei (das Bild) oder das Programm/CGI/... "muß" nicht im öffentlichen HTML-DokumenteVerzeichnis liegen.
Sie muß nur dort liegen, wo z.B. der Apache sie aufrufen kann, bzw. wo dein Programm drauf zugriff hat. (viele WebSpaces haben extra ein Unterverzeichnis, welches nicht öffentlich erreichbar ist)

Bezüglich der "URL", da ist serverintern natürlich nur die Pfadangabe von nöten.
Mit der Domain wird der Server angesprochen und intern geht es dann mit dem Pfad-Anteil weiter.
Aber man kann die Domain dennoch auslesen, wenn man sie unbedingt braucht, um z.B. unterschiedlich zu reagieren, wenn der selbe WebServer mit mehreren Domains/SubDomains verlinkt ist.

Und bei diesen zusammengesetzen Pfaden, also wenn man "Sub-Pfade" erlaubt, sollte man dringend die Pfade validieren,
denn sonst kann sich da jemand schön zugriff auf Dateien verschaffen, die eigentlich nicht öffentlich sind.
z.B.
Delphi-Quellcode:
<img src="/Images/background/bgblue.jpg"/>
oder
Delphi-Quellcode:
<img src="www.domain.de/Images/background/bgblue.jpg"/>
sind ja kein Problem, bzw. die URLs direkt im Browser aufgerufen.
Aber so Dinge wie
Delphi-Quellcode:
/../../geheimesverzeichnis/passwörter.txt
oder
Delphi-Quellcode:
/index.php
liefern dann Dateien im Klartext aus, die man nicht draußen haben wollte.

Delbor 6. Jul 2016 18:48

AW: Das System kann den Pfad nicht finden
 
Hi Himitsu
Zitat:

Nein, die Datei (das Bild) oder das Programm/CGI/... "muß" nicht im öffentlichen HTML-DokumenteVerzeichnis liegen.
Sie muß nur dort liegen, wo z.B. der Apache sie aufrufen kann, bzw. wo dein Programm drauf zugriff hat. (viele WebSpaces haben extra ein Unterverzeichnis, welches nicht öffentlich erreichbar ist)
Verstehe ich das richtig? Damit beziehst du dich darauf:
Zitat:

Das Rootverzeichnis meines Webspaces ist "/". Darüber hinaus habe ich keinen Zugriff/ist kein Zugriff erlaubt.
Das heisst: die Anwendng muss auf meinem Webspace zwingend unter diesem Verzeichnis liegen. Und wenn ich das richtig verstehe und interpretiere, müsste die Anwendung zur Entwicklungszeit unterhalb des html-Verzeichnisses liegen, was zur Zeit nicht der Fall ist. Damit könnten sich dann alle Pfade relativ zum HTML-Verzeichnis oder eben "/" beziehen.
Ich wollte damit eigentlich zum Ausdruck bringen, dass ich damit auf meinem Rechner die mir zur Verfügung stehende Verzeichnisstruktur auf dem Webspace simulieren/nachbilden kann. Unter diesem Aspekt müsste die Anwendung auf dem Webspace dann zum laufen gebracht werden können.
Zitat:

Aber so Dinge wie /../../geheimesverzeichnis/passwörter.txt oder /index.php liefern dann Dateien im Klartext aus, die man nicht draußen haben wollte.
Danke für die Info!

Gruss
Delbor


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 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