Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Eine textdatei zum Browser zurück geben (https://www.delphipraxis.net/211221-eine-textdatei-zum-browser-zurueck-geben.html)

charly52 16. Aug 2022 19:35

Eine textdatei zum Browser zurück geben
 
Hi ,

neben den JSON Strings aus diversen Records muss ich jetzt auch textdateien an den Browser zurückliefern.
Muss ich die irgendwie in "Response.Contend" einlesen und dann mit Response.ContentType:= text/plain
den Typ festlegen?
Oder geht da was mit nem Stream?
Und wenn ja, wie?

Ihr seht schon, kein Plan von dem Internetzeuch.

Danke für Hilfe

Charly

Redeemer 16. Aug 2022 20:19

AW: Eine textdatei zum Browser zurück geben
 
Hast du das, was du da schreibst, einfach mal probiert? Das ist schon mal nicht komplett falsch.
Und angeben, welches Framework du benutzt, wäre hilfreich. Indy?

charly52 17. Aug 2022 08:27

AW: Eine textdatei zum Browser zurück geben
 
Ich benutze das was Delphi 10.4 Community mir liefert, wenn ich File/new/other/delphi/Web/WebServer Application auswähle.


Delphi-Quellcode:
procedure TWebModule1.WebModule2GET_A_DatenAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
aber wie es weiter geht ist unklar wenn ich eine bestimmte Datei zurück geben möchte.

Delphi.Narium 17. Aug 2022 09:55

AW: Eine textdatei zum Browser zurück geben
 
Bei Dateien müsste das über FileStreams gehen (ungetestet hingedaddelt):
Delphi-Quellcode:
var
  fs : tFileStream;
begin
  fs := tFileStream.Create('ZuSendendeTextDatei.txt',fmOpenRead);
  try
    Response.ContentType  := 'text/plain';
    Response.ContentLength := fs.Size;
    Response.SendStream(fs);
    Response.SendResponse;
  finally
    fs.Free;
  end;
  Handled := True;
end;

Redeemer 17. Aug 2022 11:16

AW: Eine textdatei zum Browser zurück geben
 
Bei allen textbasierten Antworten (Textdateien, HTML usw.) sollte man unbedingt bei Content-Type auch den Zeichensatz angeben, da der Browser sonst Zeichen außerhalb von ASCII falsch darstellt oder im Falle von UTF-16 die Anfrage herunterladen möchte statt sie anzuzeigen:
Code:
Content-Type: text/plain; charset=utf-8
Zeichensatzangaben sind nach IANA nicht case-sensitive.

charly52 18. Aug 2022 08:52

AW: Eine textdatei zum Browser zurück geben
 
Es klemmt immer noch!

Hier mal mein Stück Code. Es ist von einem Vortrag von
Danny Wind vom SummerCamp2021 abgeleitet.
Das Ganze ist eine WebServerApplication (stand-alone webserver)
Ich habe ein WebModule mit diversen WebModule.Actions und u.a.
folgendem Code


Delphi-Quellcode:
procedure TWebModule1.WebModule1waiGET_ReportsAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Do_GET_ReportsAction(Sender,Request, Response, Handled);
end;

procedure TWebModule1.Do_GET_ReportsAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  lRKey : string;
  fs   : TFileStream;
  i    : Integer;
  s    : String;

begin
  lRKey:= Get_Param(Sender, Request);
  if (lRKey.IsEmpty) then //No Report-no param. as URL Params nor URL Segment for GET request
  begin
    Handled:= False;     //do default handler
  end
  else
  begin //param gefunden
        //https://wiki.selfhtml.org/wiki/MIME-Type
    Response.ContentType := 'text/plain; charset=' + TEncoding.UTF8.MIMEName;
    if TMonitor.Enter(gLock, 500) then {al short lock was possible}
    begin
      try //try to return the selected Report
        s:= 'meinetextdatei';
        fs:= TFileStream.Create(s, fmOpenRead);
        i:= fs.Size;
        Response.ContentLength := fs.Size;
        Response.SendStream(fs);
        Response.SendResponse;
      finally
        TMonitor.Exit(gLock);
      end;
    end;

//    if (lValue.IsEmpty) then {no Data found}
//    begin
//      //{"error":"Item not found"}
//      Response.Content := '{"error":"Item not found"}';
//    end
//    else
//    begin
//      Response.Content := lValue;
//    end;
    Handled := True;
  end;
end; //of Do_GET_ReportsAction()
mit dem code von Delphi.Narium bekomme ich jetzt im Debugger die Fehlermeldung
Zitat:

Project xyzAlone.exe raised exception class EIdSocketError with message
"Socket-Fehler # 10054 Die Verbindung wurde von Peer zurückgesetzt"

und ohne Debugger gibt es nur nen Alarmton und (no response).
Jeweils aufgerufen mit dem Rest Debugger mit folgender URL http://localhost:8080/Reports/51

Ich hoffe jetzt auf ne richtig gute Idee! Danke

Charly

KodeZwerg 18. Aug 2022 09:02

AW: Eine textdatei zum Browser zurück geben
 
Zitat:

Zitat von charly52 (Beitrag 1510260)
Zitat:

"Socket-Fehler # 10054 Die Verbindung wurde von Peer zurückgesetzt"
Ich hoffe jetzt auf ne richtig gute Idee! Danke

Hallo charly!

Ich würde mal WireShark ankurbeln und mir die Verbindung die scheitert angucken um zu erfahren woran es liegt.

DeddyH 18. Aug 2022 09:32

AW: Eine textdatei zum Browser zurück geben
 
Und müsste der FileStream nicht auch wieder freigegeben werden?

charly52 18. Aug 2022 09:33

AW: Eine textdatei zum Browser zurück geben
 
Ergänzung:

Habe in der Doku gefunden, daß die Reihenfolge anders sein muss als
ich von Delphi.Narium übernommen habe:

Delphi-Quellcode:
  Response.ContentLength := fs.Size; 1.
  Response.SendStream(fs);           3. <-------  muss man
  Response.SendResponse;             2. <-------  vertauschen.
Dann bekomme ich im Browser schon mal ein 200 OK.

Aber was muss ich machen, um den Dateiinhalt im Browser auch angezeigt zu bekommen.

Und gibt es zu diesen Themen nicht irgendwas generelles zu lesen oder als Video?

Charly

mytbo 18. Aug 2022 12:02

AW: Eine textdatei zum Browser zurück geben
 
Zitat:

Zitat von charly52 (Beitrag 1510263)
Und gibt es zu diesen Themen nicht irgendwas generelles zu lesen oder als Video?

Meine Artikel Mustache Editor mit integriertem HTTP-Server zum Anzeigen von HTML Seiten und Einführung in Interface-based Services - Server und Client wären vielleicht ein Anfang.

Bis bald...
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.
Seite 1 von 2  1 2      

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